python-iterutils 0.0.6__py3-none-any.whl → 0.0.7.1__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 CHANGED
@@ -2,20 +2,21 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
- __version__ = (0, 0, 6)
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, Awaitable, Callable, Generator, Iterable, Iterator,
16
+ AsyncIterable, AsyncIterator, Callable, Generator, Iterable, Iterator,
16
17
  )
17
18
  from inspect import isawaitable
18
- from typing import overload, Any, Literal, NamedTuple, TypeVar
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
- class YieldBase(ABC, Iterable):
27
- __slots__ = "value", "identity"
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
- @YieldBase.register
35
- class Yield(NamedTuple):
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(Yield):
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
- if not identity:
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 (StopIteration, GeneratorExit):
346
- pass
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
- if not identity:
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
- return e.value
377
- except GeneratorExit:
378
- pass
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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-iterutils
3
- Version: 0.0.6
3
+ Version: 0.0.7.1
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
@@ -0,0 +1,7 @@
1
+ LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
2
+ iterutils/__init__.py,sha256=d1nN35bvpA0SJTgYFKmWtt6cofF6p4yg1E_uhKyyzFw,12101
3
+ iterutils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ python_iterutils-0.0.7.1.dist-info/LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
5
+ python_iterutils-0.0.7.1.dist-info/METADATA,sha256=Fv-Zi3_OkM31ZPHTO0JBLmACgs7rFEqFJLchFJUWErU,1384
6
+ python_iterutils-0.0.7.1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
7
+ python_iterutils-0.0.7.1.dist-info/RECORD,,
@@ -1,7 +0,0 @@
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,,