relib 1.3.11__tar.gz → 1.3.12__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.
- {relib-1.3.11 → relib-1.3.12}/PKG-INFO +1 -1
- {relib-1.3.11 → relib-1.3.12}/pyproject.toml +1 -1
- relib-1.3.12/relib/class_utils.py +9 -0
- {relib-1.3.11 → relib-1.3.12}/relib/iter_utils.py +34 -8
- {relib-1.3.11 → relib-1.3.12}/uv.lock +1 -1
- {relib-1.3.11 → relib-1.3.12}/.gitignore +0 -0
- {relib-1.3.11 → relib-1.3.12}/.python-version +0 -0
- {relib-1.3.11 → relib-1.3.12}/LICENSE +0 -0
- {relib-1.3.11 → relib-1.3.12}/README.md +0 -0
- {relib-1.3.11 → relib-1.3.12}/relib/__init__.py +0 -0
- {relib-1.3.11 → relib-1.3.12}/relib/dict_utils.py +0 -0
- {relib-1.3.11 → relib-1.3.12}/relib/io_utils.py +0 -0
- {relib-1.3.11 → relib-1.3.12}/relib/processing_utils.py +0 -0
- {relib-1.3.11 → relib-1.3.12}/relib/runtime_tools.py +0 -0
- {relib-1.3.11 → relib-1.3.12}/relib/type_utils.py +0 -0
- {relib-1.3.11 → relib-1.3.12}/relib/types.py +0 -0
@@ -1,7 +1,8 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
from contextlib import contextmanager
|
3
|
-
from itertools import chain, islice
|
3
|
+
from itertools import chain, islice, tee
|
4
4
|
from typing import Any, Generic, Iterable, Literal, Sequence, overload
|
5
|
+
from .class_utils import slicer
|
5
6
|
from .dict_utils import dict_firsts
|
6
7
|
from .types import T1, T2, T3, T4, T5, T, U
|
7
8
|
|
@@ -17,6 +18,7 @@ __all__ = [
|
|
17
18
|
"range_of", "reversed_enumerate",
|
18
19
|
"seekable", "sort_by",
|
19
20
|
"transpose",
|
21
|
+
"unzip_iterable",
|
20
22
|
]
|
21
23
|
|
22
24
|
def as_list(iterable: Iterable[T]) -> list[T]:
|
@@ -81,6 +83,7 @@ class seekable(Generic[T]):
|
|
81
83
|
self.index = 0
|
82
84
|
self.source = iter(iterable)
|
83
85
|
self.sink: list[T] = []
|
86
|
+
self.abs = slicer(self.abs_getitem)
|
84
87
|
|
85
88
|
def __iter__(self):
|
86
89
|
return self
|
@@ -102,10 +105,10 @@ class seekable(Generic[T]):
|
|
102
105
|
self.index = 0
|
103
106
|
|
104
107
|
def seek(self, index: int) -> seekable[T]:
|
105
|
-
|
106
|
-
|
108
|
+
index = max(0, index)
|
109
|
+
self.index = min(index, len(self.sink))
|
110
|
+
if (remainder := index - self.index) > 0:
|
107
111
|
next(islice(self, remainder, remainder), None)
|
108
|
-
self.index = max(0, min(index, len(self.sink)))
|
109
112
|
return self
|
110
113
|
|
111
114
|
def step(self, count: int) -> seekable[T]:
|
@@ -130,10 +133,21 @@ class seekable(Generic[T]):
|
|
130
133
|
with self.freeze():
|
131
134
|
if isinstance(key, int):
|
132
135
|
return self[key:key + 1][0]
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
136
|
+
start, stop, step = key.start, key.stop, key.step
|
137
|
+
delta = min(self.index, -min(0, start or 0))
|
138
|
+
start = None if start is None else max(0, start + delta)
|
139
|
+
stop = None if stop is None else max(0, stop + delta)
|
140
|
+
self.step(-delta)
|
141
|
+
return list(islice(self, start, stop, step))
|
142
|
+
|
143
|
+
@overload
|
144
|
+
def abs_getitem(self, key: int) -> T: ...
|
145
|
+
@overload
|
146
|
+
def abs_getitem(self, key: slice[int | None]) -> list[T]: ...
|
147
|
+
def abs_getitem(self, key: int | slice[int | None]):
|
148
|
+
with self.freeze():
|
149
|
+
self.seek(0)
|
150
|
+
return self[key]
|
137
151
|
|
138
152
|
def consume(self) -> Iterable[T]:
|
139
153
|
for value in self:
|
@@ -185,3 +199,15 @@ def transpose(tuples: Iterable[tuple], default_num_returns=0) -> tuple[list, ...
|
|
185
199
|
if not output:
|
186
200
|
return ([],) * default_num_returns
|
187
201
|
return tuple(map(list, output))
|
202
|
+
|
203
|
+
@overload
|
204
|
+
def unzip_iterable(iterable: Iterable[tuple[T1, T2]], n: Literal[2]) -> tuple[Iterable[T1], Iterable[T2]]: ...
|
205
|
+
@overload
|
206
|
+
def unzip_iterable(iterable: Iterable[tuple[T1, T2, T3]], n: Literal[3]) -> tuple[Iterable[T1], Iterable[T2], Iterable[T3]]: ...
|
207
|
+
@overload
|
208
|
+
def unzip_iterable(iterable: Iterable[tuple[T1, T2, T3, T4]], n: Literal[4]) -> tuple[Iterable[T1], Iterable[T2], Iterable[T3], Iterable[T4]]: ...
|
209
|
+
@overload
|
210
|
+
def unzip_iterable(iterable: Iterable[tuple[T1, T2, T3, T4, T5]], n: Literal[5]) -> tuple[Iterable[T1], Iterable[T2], Iterable[T3], Iterable[T4], Iterable[T5]]: ...
|
211
|
+
def unzip_iterable(iterable: Iterable[tuple], n: int) -> tuple:
|
212
|
+
iters = tee(iterable, n)
|
213
|
+
return tuple(map(lambda i, iter: (x[i] for x in iter), range(n), iters))
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|