python-iterutils 0.0.2.3__tar.gz → 0.0.3.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.2.3 → python_iterutils-0.0.3.1}/PKG-INFO +1 -1
- {python_iterutils-0.0.2.3 → python_iterutils-0.0.3.1}/iterutils/__init__.py +55 -29
- {python_iterutils-0.0.2.3 → python_iterutils-0.0.3.1}/pyproject.toml +1 -1
- {python_iterutils-0.0.2.3 → python_iterutils-0.0.3.1}/LICENSE +0 -0
- {python_iterutils-0.0.2.3 → python_iterutils-0.0.3.1}/iterutils/py.typed +0 -0
- {python_iterutils-0.0.2.3 → python_iterutils-0.0.3.1}/readme.md +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# encoding: utf-8
|
|
3
3
|
|
|
4
4
|
__author__ = "ChenyangGao <https://chenyanggao.github.io>"
|
|
5
|
-
__version__ = (0, 0,
|
|
5
|
+
__version__ = (0, 0, 3)
|
|
6
6
|
__all__ = [
|
|
7
7
|
"iterable", "async_iterable", "foreach", "async_foreach", "through", "async_through",
|
|
8
8
|
"wrap_iter", "wrap_aiter", "acc_step", "cut_iter",
|
|
@@ -68,47 +68,73 @@ def wrap_iter(
|
|
|
68
68
|
it: Iterable[T],
|
|
69
69
|
/,
|
|
70
70
|
callprev: None | Callable[[T], Any] = None,
|
|
71
|
-
callnext: None | Callable[[T], Any] = None,
|
|
71
|
+
callnext: None | Callable[[T], Any] = None,
|
|
72
|
+
callenter: None | Callable[[Iterable[T]], Any] = None,
|
|
73
|
+
callexit: None | Callable[[Iterable[T], None | BaseException], Any] = None,
|
|
72
74
|
) -> Iterator[T]:
|
|
73
75
|
if not callable(callprev):
|
|
74
76
|
callprev = None
|
|
75
77
|
if not callable(callnext):
|
|
76
78
|
callnext = None
|
|
77
|
-
|
|
78
|
-
if
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
79
|
+
try:
|
|
80
|
+
if callable(callenter):
|
|
81
|
+
callenter(it)
|
|
82
|
+
for e in it:
|
|
83
|
+
if callprev:
|
|
84
|
+
try:
|
|
85
|
+
callprev(e)
|
|
86
|
+
except (StopIteration, GeneratorExit):
|
|
87
|
+
break
|
|
88
|
+
yield e
|
|
89
|
+
if callnext:
|
|
90
|
+
try:
|
|
91
|
+
callnext(e)
|
|
92
|
+
except (StopIteration, GeneratorExit):
|
|
93
|
+
break
|
|
94
|
+
except BaseException as e:
|
|
95
|
+
if callable(callexit):
|
|
96
|
+
if not callexit(it, e):
|
|
97
|
+
raise
|
|
98
|
+
else:
|
|
99
|
+
raise
|
|
100
|
+
finally:
|
|
101
|
+
if callable(callexit):
|
|
102
|
+
callexit(it, None)
|
|
89
103
|
|
|
90
104
|
|
|
91
105
|
async def wrap_aiter(
|
|
92
106
|
it: Iterable[T] | AsyncIterable[T],
|
|
93
107
|
/,
|
|
94
108
|
callprev: None | Callable[[T], Any] = None,
|
|
95
|
-
callnext: None | Callable[[T], Any] = None,
|
|
109
|
+
callnext: None | Callable[[T], Any] = None,
|
|
110
|
+
callenter: None | Callable[[Iterable[T] | AsyncIterable[T]], Any] = None,
|
|
111
|
+
callexit: None | Callable[[Iterable[T] | AsyncIterable[T], None | BaseException], Any] = None,
|
|
96
112
|
threaded: bool = True,
|
|
97
113
|
) -> AsyncIterator[T]:
|
|
98
|
-
callprev = ensure_async(callprev) if callable(callprev) else None
|
|
99
|
-
callnext = ensure_async(callnext) if callable(callnext) else None
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
114
|
+
callprev = ensure_async(callprev, threaded=threaded) if callable(callprev) else None
|
|
115
|
+
callnext = ensure_async(callnext, threaded=threaded) if callable(callnext) else None
|
|
116
|
+
try:
|
|
117
|
+
async for e in ensure_aiter(it, threaded=threaded):
|
|
118
|
+
if callprev:
|
|
119
|
+
try:
|
|
120
|
+
await callprev(e)
|
|
121
|
+
except (StopAsyncIteration, GeneratorExit):
|
|
122
|
+
break
|
|
123
|
+
yield e
|
|
124
|
+
if callnext:
|
|
125
|
+
try:
|
|
126
|
+
await callnext(e)
|
|
127
|
+
except (StopAsyncIteration, GeneratorExit):
|
|
128
|
+
break
|
|
129
|
+
except BaseException as e:
|
|
130
|
+
if callable(callexit):
|
|
131
|
+
if not await ensure_async(callexit, threaded=threaded)(it, e):
|
|
132
|
+
raise
|
|
133
|
+
else:
|
|
134
|
+
raise
|
|
135
|
+
finally:
|
|
136
|
+
if callable(callexit):
|
|
137
|
+
await ensure_async(callexit, threaded=threaded)(it, None)
|
|
112
138
|
|
|
113
139
|
|
|
114
140
|
def acc_step(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|