python-iterutils 0.0.5__tar.gz → 0.0.6__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-iterutils
3
- Version: 0.0.5
3
+ Version: 0.0.6
4
4
  Summary: Python another itertools.
5
5
  Home-page: https://github.com/ChenyangGao/web-mount-packs/tree/main/python-module/python-iterutils
6
6
  License: MIT
@@ -2,19 +2,20 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
- __version__ = (0, 0, 5)
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 Yield:
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
- def __init__(self, value, /):
34
- self.value = value
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(func: Callable, iterable, /, *iterables):
59
+ def foreach(ret: Callable, iterable, /, *iterables):
52
60
  if iterables:
53
61
  for args in zip(iterable, *iterables):
54
- func(*args)
62
+ ret(*args)
55
63
  else:
56
64
  for arg in iterable:
57
- func(arg)
65
+ ret(arg)
58
66
 
59
67
 
60
- async def async_foreach(func: Callable, iterable, /, *iterables, threaded: bool = True):
61
- func = ensure_async(func, threaded=threaded)
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 func(*args)
72
+ await ret(*args)
65
73
  else:
66
74
  async for arg in ensure_aiter(iterable, threaded=threaded):
67
- await func(arg)
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
- func = await to_thread(send, None)
210
+ ret = await to_thread(send, None)
203
211
  else:
204
- func = send(None)
212
+ ret = send(None)
205
213
  while True:
206
214
  try:
207
- if isawaitable(func):
208
- ret = await func
209
- elif callable(func):
210
- ret = func()
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
- func = await to_thread(throw, e)
223
+ ret = await to_thread(throw, e)
218
224
  else:
219
- func = throw(e)
225
+ ret = throw(e)
220
226
  else:
221
227
  if threaded:
222
- func = await to_thread(send, ret)
228
+ ret = await to_thread(send, ret)
223
229
  else:
224
- func = send(ret)
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
- func = send(None)
257
+ ret = send(None)
252
258
  while True:
253
259
  try:
254
- ret = func() if callable(func) else func
260
+ if callable(ret):
261
+ ret = ret()
255
262
  except BaseException as e:
256
- func = throw(e)
263
+ ret = throw(e)
257
264
  else:
258
- func = send(ret)
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
- func = await to_thread(send, None)
310
+ ret = await to_thread(send, None)
304
311
  else:
305
- func = send(None)
312
+ ret = send(None)
306
313
  while True:
307
314
  yield_type = 0
308
- if isinstance(func, Yield):
309
- yield_type = 1
310
- elif isinstance(func, YieldFrom):
311
- yield_type = 2
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 isawaitable(func):
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
- else:
322
- ret = func
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
- func = await to_thread(throw, e)
331
+ ret = await to_thread(throw, e)
326
332
  else:
327
- func = throw(e)
333
+ ret = throw(e)
328
334
  else:
329
- if yield_type == 1:
330
- yield ret
331
- elif yield_type == 2:
332
- async for val in ensure_aiter(ret, threaded=threaded):
333
- yield val
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
- func = await to_thread(send, ret)
342
+ ret = await to_thread(send, ret)
336
343
  else:
337
- func = send(ret)
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
- func = send(None)
356
+ ret = send(None)
350
357
  while True:
351
358
  yield_type = 0
352
- if isinstance(func, Yield):
353
- yield_type = 1
354
- elif isinstance(func, YieldFrom):
355
- yield_type = 2
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
- ret = func() if callable(func) else func
364
+ if not identity:
365
+ ret = ret() if callable(ret) else ret
360
366
  except BaseException as e:
361
- func = throw(e)
367
+ ret = throw(e)
362
368
  else:
363
- if yield_type == 1:
364
- yield ret
365
- elif yield_type == 2:
366
- yield from ret
367
- func = send(ret)
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:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-iterutils"
3
- version = "0.0.5"
3
+ version = "0.0.6"
4
4
  description = "Python another itertools."
5
5
  authors = ["ChenyangGao <wosiwujm@gmail.com>"]
6
6
  license = "MIT"