python-iterutils 0.0.6__tar.gz → 0.0.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_iterutils-0.0.6 → python_iterutils-0.0.7.1}/PKG-INFO +1 -1
- {python_iterutils-0.0.6 → python_iterutils-0.0.7.1}/iterutils/__init__.py +71 -50
- {python_iterutils-0.0.6 → python_iterutils-0.0.7.1}/pyproject.toml +1 -1
- {python_iterutils-0.0.6 → python_iterutils-0.0.7.1}/LICENSE +0 -0
- {python_iterutils-0.0.6 → python_iterutils-0.0.7.1}/iterutils/py.typed +0 -0
- {python_iterutils-0.0.6 → python_iterutils-0.0.7.1}/readme.md +0 -0
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
# encoding: utf-8
|
|
3
3
|
|
|
4
4
|
__author__ = "ChenyangGao <https://chenyanggao.github.io>"
|
|
5
|
-
__version__ = (0, 0,
|
|
5
|
+
__version__ = (0, 0, 7)
|
|
6
6
|
__all__ = [
|
|
7
7
|
"iterable", "async_iterable", "foreach", "async_foreach", "through", "async_through",
|
|
8
8
|
"wrap_iter", "wrap_aiter", "acc_step", "cut_iter", "run_gen_step", "run_gen_step_iter",
|
|
9
9
|
"Yield", "YieldFrom",
|
|
10
10
|
]
|
|
11
11
|
|
|
12
|
+
from dataclasses import dataclass
|
|
12
13
|
from abc import ABC, abstractmethod
|
|
13
14
|
from asyncio import to_thread
|
|
14
15
|
from collections.abc import (
|
|
15
|
-
AsyncIterable, AsyncIterator,
|
|
16
|
+
AsyncIterable, AsyncIterator, Callable, Generator, Iterable, Iterator,
|
|
16
17
|
)
|
|
17
18
|
from inspect import isawaitable
|
|
18
|
-
from typing import overload, Any, Literal,
|
|
19
|
+
from typing import overload, Any, Literal, TypeVar
|
|
19
20
|
|
|
20
21
|
from asynctools import async_zip, ensure_async, ensure_aiter
|
|
21
22
|
|
|
@@ -23,22 +24,23 @@ from asynctools import async_zip, ensure_async, ensure_aiter
|
|
|
23
24
|
T = TypeVar("T")
|
|
24
25
|
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
@dataclass(slots=True, frozen=True)
|
|
28
|
+
class YieldBase(ABC):
|
|
29
|
+
value: Any
|
|
30
|
+
identity: bool = False
|
|
31
|
+
try_call_me: bool = True
|
|
32
|
+
|
|
28
33
|
@property
|
|
29
34
|
@abstractmethod
|
|
30
35
|
def yield_type(self, /) -> int:
|
|
31
36
|
...
|
|
32
37
|
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
value: Any
|
|
37
|
-
identity: bool = False
|
|
38
|
-
yield_type = 1 # type: ignore
|
|
39
|
+
class Yield(YieldBase):
|
|
40
|
+
yield_type = 1
|
|
39
41
|
|
|
40
42
|
|
|
41
|
-
class YieldFrom(
|
|
43
|
+
class YieldFrom(YieldBase):
|
|
42
44
|
yield_type = 2
|
|
43
45
|
|
|
44
46
|
|
|
@@ -212,12 +214,10 @@ def run_gen_step(
|
|
|
212
214
|
ret = send(None)
|
|
213
215
|
while True:
|
|
214
216
|
try:
|
|
217
|
+
if callable(ret):
|
|
218
|
+
ret = ret()
|
|
215
219
|
if isawaitable(ret):
|
|
216
220
|
ret = await ret
|
|
217
|
-
elif callable(ret):
|
|
218
|
-
ret = ret()
|
|
219
|
-
if isawaitable(ret):
|
|
220
|
-
ret = await ret
|
|
221
221
|
except BaseException as e:
|
|
222
222
|
if threaded:
|
|
223
223
|
ret = await to_thread(throw, e)
|
|
@@ -305,45 +305,55 @@ def run_gen_step_iter(
|
|
|
305
305
|
throw = gen.throw
|
|
306
306
|
if async_:
|
|
307
307
|
async def process():
|
|
308
|
+
async def extract(ret):
|
|
309
|
+
yield_type = 0
|
|
310
|
+
identity = False
|
|
311
|
+
try_call_me = True
|
|
312
|
+
if isinstance(ret, YieldBase):
|
|
313
|
+
identity = ret.identity
|
|
314
|
+
try_call_me = ret.try_call_me
|
|
315
|
+
yield_type = ret.yield_type
|
|
316
|
+
ret = ret.value
|
|
317
|
+
if not identity:
|
|
318
|
+
if try_call_me and callable(ret):
|
|
319
|
+
ret = ret()
|
|
320
|
+
if isawaitable(ret):
|
|
321
|
+
ret = await ret
|
|
322
|
+
return yield_type, ret
|
|
308
323
|
try:
|
|
309
324
|
if threaded:
|
|
310
325
|
ret = await to_thread(send, None)
|
|
311
326
|
else:
|
|
312
327
|
ret = send(None)
|
|
313
328
|
while True:
|
|
314
|
-
yield_type = 0
|
|
315
|
-
identity = False
|
|
316
|
-
if isinstance(ret, YieldBase):
|
|
317
|
-
yield_type = ret.yield_type
|
|
318
|
-
ret, identity = ret
|
|
319
329
|
try:
|
|
320
|
-
|
|
321
|
-
if isawaitable(ret):
|
|
322
|
-
ret = await ret
|
|
323
|
-
elif callable(ret):
|
|
324
|
-
ret = ret()
|
|
325
|
-
if isawaitable(ret):
|
|
326
|
-
ret = await ret
|
|
327
|
-
else:
|
|
328
|
-
ret = ret
|
|
329
|
-
except BaseException as e:
|
|
330
|
-
if threaded:
|
|
331
|
-
ret = await to_thread(throw, e)
|
|
332
|
-
else:
|
|
333
|
-
ret = throw(e)
|
|
334
|
-
else:
|
|
330
|
+
yield_type, ret = await extract(ret)
|
|
335
331
|
match yield_type:
|
|
336
332
|
case 1:
|
|
337
333
|
yield ret
|
|
338
334
|
case 2:
|
|
339
335
|
async for val in ensure_aiter(ret, threaded=threaded):
|
|
340
336
|
yield val
|
|
337
|
+
except BaseException as e:
|
|
338
|
+
if threaded:
|
|
339
|
+
ret = await to_thread(throw, e)
|
|
340
|
+
else:
|
|
341
|
+
ret = throw(e)
|
|
342
|
+
else:
|
|
341
343
|
if threaded:
|
|
342
344
|
ret = await to_thread(send, ret)
|
|
343
345
|
else:
|
|
344
346
|
ret = send(ret)
|
|
345
|
-
except
|
|
346
|
-
|
|
347
|
+
except StopIteration as e:
|
|
348
|
+
ret = e.value
|
|
349
|
+
if isinstance(ret, YieldBase):
|
|
350
|
+
yield_type, ret = await extract(ret)
|
|
351
|
+
match yield_type:
|
|
352
|
+
case 1:
|
|
353
|
+
yield ret
|
|
354
|
+
case 2:
|
|
355
|
+
async for val in ensure_aiter(ret, threaded=threaded):
|
|
356
|
+
yield val
|
|
347
357
|
finally:
|
|
348
358
|
if close is not None:
|
|
349
359
|
if threaded:
|
|
@@ -352,30 +362,41 @@ def run_gen_step_iter(
|
|
|
352
362
|
close()
|
|
353
363
|
else:
|
|
354
364
|
def process():
|
|
365
|
+
def extract(ret):
|
|
366
|
+
yield_type = 0
|
|
367
|
+
identity = False
|
|
368
|
+
try_call_me = True
|
|
369
|
+
if isinstance(ret, YieldBase):
|
|
370
|
+
identity = ret.identity
|
|
371
|
+
try_call_me = ret.try_call_me
|
|
372
|
+
yield_type = ret.yield_type
|
|
373
|
+
ret = ret.value
|
|
374
|
+
if not identity and try_call_me and callable(ret):
|
|
375
|
+
ret = ret()
|
|
376
|
+
return yield_type, ret
|
|
355
377
|
try:
|
|
356
378
|
ret = send(None)
|
|
357
379
|
while True:
|
|
358
|
-
yield_type = 0
|
|
359
|
-
identity = False
|
|
360
|
-
if isinstance(ret, YieldBase):
|
|
361
|
-
yield_type = ret.yield_type
|
|
362
|
-
ret, identity = ret
|
|
363
380
|
try:
|
|
364
|
-
|
|
365
|
-
ret = ret() if callable(ret) else ret
|
|
366
|
-
except BaseException as e:
|
|
367
|
-
ret = throw(e)
|
|
368
|
-
else:
|
|
381
|
+
yield_type, ret = extract(ret)
|
|
369
382
|
match yield_type:
|
|
370
383
|
case 1:
|
|
371
384
|
yield ret
|
|
372
385
|
case 2:
|
|
373
386
|
yield from ret
|
|
387
|
+
except BaseException as e:
|
|
388
|
+
ret = throw(e)
|
|
389
|
+
else:
|
|
374
390
|
ret = send(ret)
|
|
375
391
|
except StopIteration as e:
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
392
|
+
ret = e.value
|
|
393
|
+
if isinstance(ret, YieldBase):
|
|
394
|
+
yield_type, ret = extract(ret)
|
|
395
|
+
match yield_type:
|
|
396
|
+
case 1:
|
|
397
|
+
yield ret
|
|
398
|
+
case 2:
|
|
399
|
+
yield from ret
|
|
379
400
|
finally:
|
|
380
401
|
if close is not None:
|
|
381
402
|
close()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|