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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-iterutils
3
- Version: 0.0.2.3
3
+ Version: 0.0.3.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
@@ -2,7 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
- __version__ = (0, 0, 2)
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
- for e in it:
78
- if callprev:
79
- try:
80
- callprev(e)
81
- except (StopIteration, GeneratorExit):
82
- break
83
- yield e
84
- if callnext:
85
- try:
86
- callnext(e)
87
- except (StopIteration, GeneratorExit):
88
- break
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
- async for e in ensure_aiter(it, threaded=threaded):
101
- if callprev:
102
- try:
103
- await callprev(e)
104
- except (StopAsyncIteration, GeneratorExit):
105
- break
106
- yield e
107
- if callnext:
108
- try:
109
- await callnext(e)
110
- except (StopAsyncIteration, GeneratorExit):
111
- break
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(
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-iterutils"
3
- version = "0.0.2.3"
3
+ version = "0.0.3.1"
4
4
  description = "Python another itertools."
5
5
  authors = ["ChenyangGao <wosiwujm@gmail.com>"]
6
6
  license = "MIT"