python-iterutils 0.0.5__py3-none-any.whl → 0.0.6__py3-none-any.whl
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.
- iterutils/__init__.py +75 -68
- {python_iterutils-0.0.5.dist-info → python_iterutils-0.0.6.dist-info}/METADATA +1 -1
- python_iterutils-0.0.6.dist-info/RECORD +7 -0
- python_iterutils-0.0.5.dist-info/RECORD +0 -7
- {python_iterutils-0.0.5.dist-info → python_iterutils-0.0.6.dist-info}/LICENSE +0 -0
- {python_iterutils-0.0.5.dist-info → python_iterutils-0.0.6.dist-info}/WHEEL +0 -0
iterutils/__init__.py
CHANGED
|
@@ -2,19 +2,20 @@
|
|
|
2
2
|
# encoding: utf-8
|
|
3
3
|
|
|
4
4
|
__author__ = "ChenyangGao <https://chenyanggao.github.io>"
|
|
5
|
-
__version__ = (0, 0,
|
|
5
|
+
__version__ = (0, 0, 6)
|
|
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 abc import ABC, abstractmethod
|
|
12
13
|
from asyncio import to_thread
|
|
13
14
|
from collections.abc import (
|
|
14
15
|
AsyncIterable, AsyncIterator, Awaitable, Callable, Generator, Iterable, Iterator,
|
|
15
16
|
)
|
|
16
17
|
from inspect import isawaitable
|
|
17
|
-
from typing import overload, Any, Literal, TypeVar
|
|
18
|
+
from typing import overload, Any, Literal, NamedTuple, TypeVar
|
|
18
19
|
|
|
19
20
|
from asynctools import async_zip, ensure_async, ensure_aiter
|
|
20
21
|
|
|
@@ -22,16 +23,23 @@ from asynctools import async_zip, ensure_async, ensure_aiter
|
|
|
22
23
|
T = TypeVar("T")
|
|
23
24
|
|
|
24
25
|
|
|
25
|
-
class
|
|
26
|
+
class YieldBase(ABC, Iterable):
|
|
27
|
+
__slots__ = "value", "identity"
|
|
28
|
+
@property
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def yield_type(self, /) -> int:
|
|
31
|
+
...
|
|
26
32
|
|
|
27
|
-
def __init__(self, value, /):
|
|
28
|
-
self.value = value
|
|
29
33
|
|
|
34
|
+
@YieldBase.register
|
|
35
|
+
class Yield(NamedTuple):
|
|
36
|
+
value: Any
|
|
37
|
+
identity: bool = False
|
|
38
|
+
yield_type = 1 # type: ignore
|
|
30
39
|
|
|
31
|
-
class YieldFrom:
|
|
32
40
|
|
|
33
|
-
|
|
34
|
-
|
|
41
|
+
class YieldFrom(Yield):
|
|
42
|
+
yield_type = 2
|
|
35
43
|
|
|
36
44
|
|
|
37
45
|
def iterable(it, /) -> bool:
|
|
@@ -48,23 +56,23 @@ def async_iterable(it, /) -> bool:
|
|
|
48
56
|
return False
|
|
49
57
|
|
|
50
58
|
|
|
51
|
-
def foreach(
|
|
59
|
+
def foreach(ret: Callable, iterable, /, *iterables):
|
|
52
60
|
if iterables:
|
|
53
61
|
for args in zip(iterable, *iterables):
|
|
54
|
-
|
|
62
|
+
ret(*args)
|
|
55
63
|
else:
|
|
56
64
|
for arg in iterable:
|
|
57
|
-
|
|
65
|
+
ret(arg)
|
|
58
66
|
|
|
59
67
|
|
|
60
|
-
async def async_foreach(
|
|
61
|
-
|
|
68
|
+
async def async_foreach(ret: Callable, iterable, /, *iterables, threaded: bool = True):
|
|
69
|
+
ret = ensure_async(ret, threaded=threaded)
|
|
62
70
|
if iterables:
|
|
63
71
|
async for args in async_zip(iterable, *iterables, threaded=threaded):
|
|
64
|
-
await
|
|
72
|
+
await ret(*args)
|
|
65
73
|
else:
|
|
66
74
|
async for arg in ensure_aiter(iterable, threaded=threaded):
|
|
67
|
-
await
|
|
75
|
+
await ret(arg)
|
|
68
76
|
|
|
69
77
|
|
|
70
78
|
def through(it: Iterable, /):
|
|
@@ -199,29 +207,27 @@ def run_gen_step(
|
|
|
199
207
|
async def process():
|
|
200
208
|
try:
|
|
201
209
|
if threaded:
|
|
202
|
-
|
|
210
|
+
ret = await to_thread(send, None)
|
|
203
211
|
else:
|
|
204
|
-
|
|
212
|
+
ret = send(None)
|
|
205
213
|
while True:
|
|
206
214
|
try:
|
|
207
|
-
if isawaitable(
|
|
208
|
-
ret = await
|
|
209
|
-
elif callable(
|
|
210
|
-
ret =
|
|
215
|
+
if isawaitable(ret):
|
|
216
|
+
ret = await ret
|
|
217
|
+
elif callable(ret):
|
|
218
|
+
ret = ret()
|
|
211
219
|
if isawaitable(ret):
|
|
212
220
|
ret = await ret
|
|
213
|
-
else:
|
|
214
|
-
ret = func
|
|
215
221
|
except BaseException as e:
|
|
216
222
|
if threaded:
|
|
217
|
-
|
|
223
|
+
ret = await to_thread(throw, e)
|
|
218
224
|
else:
|
|
219
|
-
|
|
225
|
+
ret = throw(e)
|
|
220
226
|
else:
|
|
221
227
|
if threaded:
|
|
222
|
-
|
|
228
|
+
ret = await to_thread(send, ret)
|
|
223
229
|
else:
|
|
224
|
-
|
|
230
|
+
ret = send(ret)
|
|
225
231
|
except StopIteration as e:
|
|
226
232
|
return e.value
|
|
227
233
|
finally:
|
|
@@ -248,14 +254,15 @@ def run_gen_step(
|
|
|
248
254
|
return result
|
|
249
255
|
else:
|
|
250
256
|
try:
|
|
251
|
-
|
|
257
|
+
ret = send(None)
|
|
252
258
|
while True:
|
|
253
259
|
try:
|
|
254
|
-
|
|
260
|
+
if callable(ret):
|
|
261
|
+
ret = ret()
|
|
255
262
|
except BaseException as e:
|
|
256
|
-
|
|
263
|
+
ret = throw(e)
|
|
257
264
|
else:
|
|
258
|
-
|
|
265
|
+
ret = send(ret)
|
|
259
266
|
except StopIteration as e:
|
|
260
267
|
result = e.value
|
|
261
268
|
if as_iter:
|
|
@@ -300,41 +307,41 @@ def run_gen_step_iter(
|
|
|
300
307
|
async def process():
|
|
301
308
|
try:
|
|
302
309
|
if threaded:
|
|
303
|
-
|
|
310
|
+
ret = await to_thread(send, None)
|
|
304
311
|
else:
|
|
305
|
-
|
|
312
|
+
ret = send(None)
|
|
306
313
|
while True:
|
|
307
314
|
yield_type = 0
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
if yield_type:
|
|
313
|
-
func = func.value
|
|
315
|
+
identity = False
|
|
316
|
+
if isinstance(ret, YieldBase):
|
|
317
|
+
yield_type = ret.yield_type
|
|
318
|
+
ret, identity = ret
|
|
314
319
|
try:
|
|
315
|
-
if
|
|
316
|
-
ret = await func
|
|
317
|
-
elif callable(func):
|
|
318
|
-
ret = func()
|
|
320
|
+
if not identity:
|
|
319
321
|
if isawaitable(ret):
|
|
320
322
|
ret = await ret
|
|
321
|
-
|
|
322
|
-
|
|
323
|
+
elif callable(ret):
|
|
324
|
+
ret = ret()
|
|
325
|
+
if isawaitable(ret):
|
|
326
|
+
ret = await ret
|
|
327
|
+
else:
|
|
328
|
+
ret = ret
|
|
323
329
|
except BaseException as e:
|
|
324
330
|
if threaded:
|
|
325
|
-
|
|
331
|
+
ret = await to_thread(throw, e)
|
|
326
332
|
else:
|
|
327
|
-
|
|
333
|
+
ret = throw(e)
|
|
328
334
|
else:
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
335
|
+
match yield_type:
|
|
336
|
+
case 1:
|
|
337
|
+
yield ret
|
|
338
|
+
case 2:
|
|
339
|
+
async for val in ensure_aiter(ret, threaded=threaded):
|
|
340
|
+
yield val
|
|
334
341
|
if threaded:
|
|
335
|
-
|
|
342
|
+
ret = await to_thread(send, ret)
|
|
336
343
|
else:
|
|
337
|
-
|
|
344
|
+
ret = send(ret)
|
|
338
345
|
except (StopIteration, GeneratorExit):
|
|
339
346
|
pass
|
|
340
347
|
finally:
|
|
@@ -346,25 +353,25 @@ def run_gen_step_iter(
|
|
|
346
353
|
else:
|
|
347
354
|
def process():
|
|
348
355
|
try:
|
|
349
|
-
|
|
356
|
+
ret = send(None)
|
|
350
357
|
while True:
|
|
351
358
|
yield_type = 0
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
if yield_type:
|
|
357
|
-
func = func.value
|
|
359
|
+
identity = False
|
|
360
|
+
if isinstance(ret, YieldBase):
|
|
361
|
+
yield_type = ret.yield_type
|
|
362
|
+
ret, identity = ret
|
|
358
363
|
try:
|
|
359
|
-
|
|
364
|
+
if not identity:
|
|
365
|
+
ret = ret() if callable(ret) else ret
|
|
360
366
|
except BaseException as e:
|
|
361
|
-
|
|
367
|
+
ret = throw(e)
|
|
362
368
|
else:
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
369
|
+
match yield_type:
|
|
370
|
+
case 1:
|
|
371
|
+
yield ret
|
|
372
|
+
case 2:
|
|
373
|
+
yield from ret
|
|
374
|
+
ret = send(ret)
|
|
368
375
|
except StopIteration as e:
|
|
369
376
|
return e.value
|
|
370
377
|
except GeneratorExit:
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
|
|
2
|
+
iterutils/__init__.py,sha256=aYUSOaw43HFhnmfoT8pawi-KKY4WDOH_iXngkjqQd6o,11355
|
|
3
|
+
iterutils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
python_iterutils-0.0.6.dist-info/LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
|
|
5
|
+
python_iterutils-0.0.6.dist-info/METADATA,sha256=-WzkUWH49JTub_IGyT4aT65QEjso9tjiGWGLzdyc5AQ,1382
|
|
6
|
+
python_iterutils-0.0.6.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
7
|
+
python_iterutils-0.0.6.dist-info/RECORD,,
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
|
|
2
|
-
iterutils/__init__.py,sha256=2DJxe5pFy9Y8kePciX4wlkmhl4HgYaJKbBNvHk45J1M,11199
|
|
3
|
-
iterutils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
python_iterutils-0.0.5.dist-info/LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
|
|
5
|
-
python_iterutils-0.0.5.dist-info/METADATA,sha256=w5Iy3Izn-dzUcqWxpWzlrEMcGmCFT_aPU6htLB66wHk,1382
|
|
6
|
-
python_iterutils-0.0.5.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
7
|
-
python_iterutils-0.0.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|