python-iterutils 0.1.1__tar.gz → 0.1.2.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.1.1
3
+ Version: 0.1.2.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,11 +2,12 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
- __version__ = (0, 1, 1)
5
+ __version__ = (0, 1, 2)
6
6
  __all__ = [
7
7
  "Return", "Yield", "YieldFrom", "iterable", "async_iterable", "foreach", "async_foreach",
8
- "through", "async_through", "flatten", "async_flatten", "chunked", "wrap_iter", "wrap_aiter",
9
- "acc_step", "cut_iter", "run_gen_step", "run_gen_step_iter", "bfs_gen",
8
+ "through", "async_through", "flatten", "async_flatten", "iter_unique", "async_iter_unique",
9
+ "chunked", "wrap_iter", "wrap_aiter", "acc_step", "cut_iter", "run_gen_step",
10
+ "run_gen_step_iter", "bfs_gen",
10
11
  ]
11
12
 
12
13
 
@@ -15,7 +16,7 @@ from asyncio import to_thread
15
16
  from collections import deque
16
17
  from collections.abc import (
17
18
  AsyncIterable, AsyncIterator, Buffer, Callable, Generator,
18
- Iterable, Iterator, Sequence,
19
+ Iterable, Iterator, MutableSet, Sequence,
19
20
  )
20
21
  from dataclasses import dataclass
21
22
  from itertools import batched, pairwise
@@ -136,20 +137,20 @@ def flatten(
136
137
  iterable: Iterable,
137
138
  /,
138
139
  exclude_types: type | tuple[type, ...] = (Buffer, str),
139
- ) -> Iterable:
140
+ ) -> Iterator:
140
141
  ...
141
142
  @overload
142
143
  def flatten(
143
144
  iterable: AsyncIterable,
144
145
  /,
145
146
  exclude_types: type | tuple[type, ...] = (Buffer, str),
146
- ) -> AsyncIterable:
147
+ ) -> AsyncIterator:
147
148
  ...
148
149
  def flatten(
149
150
  iterable: Iterable | AsyncIterable,
150
151
  /,
151
152
  exclude_types: type | tuple[type, ...] = (Buffer, str),
152
- ) -> Iterable | AsyncIterable:
153
+ ) -> Iterator | AsyncIterator:
153
154
  if not isinstance(iterable, Iterable):
154
155
  return async_flatten(iterable, exclude_types)
155
156
  def gen(iterable):
@@ -175,6 +176,53 @@ async def async_flatten(
175
176
  yield e
176
177
 
177
178
 
179
+ @overload
180
+ def iter_unique[T](
181
+ iterable: Iterable[T],
182
+ /,
183
+ seen: None | MutableSet = None,
184
+ ) -> Iterator[T]:
185
+ ...
186
+ @overload
187
+ def iter_unique[T](
188
+ iterable: AsyncIterable[T],
189
+ /,
190
+ seen: None | MutableSet = None,
191
+ ) -> AsyncIterator[T]:
192
+ ...
193
+ def iter_unique[T](
194
+ iterable: Iterable[T] | AsyncIterable[T],
195
+ /,
196
+ seen: None | MutableSet = None,
197
+ ) -> Iterator[T] | AsyncIterator[T]:
198
+ if not isinstance(iterable, Iterable):
199
+ return async_iter_unique(iterable, seen)
200
+ if seen is None:
201
+ seen = set()
202
+ def gen(iterable):
203
+ add = seen.add
204
+ for e in iterable:
205
+ if e not in seen:
206
+ yield e
207
+ add(e)
208
+ return gen(iterable)
209
+
210
+
211
+ async def async_iter_unique[T](
212
+ iterable: Iterable[T] | AsyncIterable[T],
213
+ /,
214
+ seen: None | MutableSet = None,
215
+ threaded: bool = False,
216
+ ) -> AsyncIterator[T]:
217
+ if seen is None:
218
+ seen = set()
219
+ add = seen.add
220
+ async for e in ensure_aiter(iterable, threaded=threaded):
221
+ if e not in seen:
222
+ yield e
223
+ add(e)
224
+
225
+
178
226
  @overload
179
227
  def chunked[T](
180
228
  iterable: Iterable[T],
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-iterutils"
3
- version = "0.1.1"
3
+ version = "0.1.2.1"
4
4
  description = "Python another itertools."
5
5
  authors = ["ChenyangGao <wosiwujm@gmail.com>"]
6
6
  license = "MIT"