omlish 0.0.0.dev164__py3-none-any.whl → 0.0.0.dev166__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,132 @@
1
+ import collections
2
+ import typing as ta
3
+
4
+
5
+ T = ta.TypeVar('T')
6
+
7
+
8
+ _MISSING = object()
9
+
10
+
11
+ class PeekIterator(ta.Iterator[T]):
12
+
13
+ def __init__(self, it: ta.Iterable[T]) -> None:
14
+ super().__init__()
15
+
16
+ self._it = iter(it)
17
+ self._pos = -1
18
+ self._next_item: ta.Any = _MISSING
19
+
20
+ _item: T
21
+
22
+ def __iter__(self) -> ta.Self:
23
+ return self
24
+
25
+ @property
26
+ def done(self) -> bool:
27
+ try:
28
+ self.peek()
29
+ except StopIteration:
30
+ return True
31
+ else:
32
+ return False
33
+
34
+ def __next__(self) -> T:
35
+ if self._next_item is not _MISSING:
36
+ self._item = ta.cast(T, self._next_item)
37
+ self._next_item = _MISSING
38
+ else:
39
+ self._item = next(self._it)
40
+ self._pos += 1
41
+ return self._item
42
+
43
+ def peek(self) -> T:
44
+ if self._next_item is not _MISSING:
45
+ return ta.cast(T, self._next_item)
46
+ self._next_item = next(self._it)
47
+ return self._next_item
48
+
49
+ def next_peek(self) -> T:
50
+ next(self)
51
+ return self.peek()
52
+
53
+ def takewhile(self, fn: ta.Callable[[T], bool]) -> ta.Iterator[T]:
54
+ while fn(self.peek()):
55
+ yield next(self)
56
+
57
+ def skipwhile(self, fn: ta.Callable[[T], bool]) -> None:
58
+ while fn(self.peek()):
59
+ next(self)
60
+
61
+ def takeuntil(self, fn: ta.Callable[[T], bool]) -> ta.Iterator[T]:
62
+ return self.takewhile(lambda e: not fn(e))
63
+
64
+ def skipuntil(self, fn: ta.Callable[[T], bool]) -> None:
65
+ self.skipwhile(lambda e: not fn(e))
66
+
67
+ def takethrough(self, pos: int) -> ta.Iterator[T]:
68
+ return self.takewhile(lambda _: self._pos < pos)
69
+
70
+ def skipthrough(self, pos: int) -> None:
71
+ self.skipwhile(lambda _: self._pos < pos)
72
+
73
+ def taketo(self, pos: int) -> ta.Iterator[T]:
74
+ return self.takethrough(pos - 1)
75
+
76
+ def skipto(self, pos: int) -> None:
77
+ self.skipthrough(pos - 1)
78
+
79
+
80
+ class ProxyIterator(ta.Iterator[T]):
81
+
82
+ def __init__(self, fn: ta.Callable[[], T]) -> None:
83
+ self._fn = fn
84
+
85
+ def __iter__(self) -> ta.Self:
86
+ return self
87
+
88
+ def __next__(self) -> T:
89
+ return self._fn()
90
+
91
+
92
+ class PrefetchIterator(ta.Iterator[T]):
93
+
94
+ def __init__(self, fn: ta.Callable[[], T] | None = None) -> None:
95
+ super().__init__()
96
+
97
+ self._fn = fn
98
+ self._deque: collections.deque[T] = collections.deque()
99
+
100
+ def __iter__(self) -> ta.Self:
101
+ return self
102
+
103
+ def push(self, item) -> None:
104
+ self._deque.append(item)
105
+
106
+ def __next__(self) -> T:
107
+ try:
108
+ return self._deque.popleft()
109
+ except IndexError:
110
+ if self._fn is None:
111
+ raise StopIteration from None
112
+ return self._fn()
113
+
114
+
115
+ class RetainIterator(ta.Iterator[T]):
116
+
117
+ def __init__(self, fn: ta.Callable[[], T]) -> None:
118
+ super().__init__()
119
+
120
+ self._fn = fn
121
+ self._deque: collections.deque[T] = collections.deque()
122
+
123
+ def __iter__(self) -> ta.Self:
124
+ return self
125
+
126
+ def pop(self) -> None:
127
+ self._deque.popleft()
128
+
129
+ def __next__(self) -> T:
130
+ item = self._fn()
131
+ self._deque.append(item)
132
+ return item
@@ -0,0 +1,18 @@
1
+ """
2
+ https://docs.python.org/3/library/itertools.html#itertools-recipes
3
+ """
4
+ import collections
5
+ import itertools
6
+ import typing as ta
7
+
8
+
9
+ T = ta.TypeVar('T')
10
+
11
+
12
+ def sliding_window(it: ta.Iterable[T], n: int) -> ta.Iterator[tuple[T, ...]]:
13
+ # sliding_window('ABCDEFG', 4) -> ABCD BCDE CDEF DEFG
14
+ iterator = iter(it)
15
+ window = collections.deque(itertools.islice(iterator, n - 1), maxlen=n)
16
+ for x in iterator:
17
+ window.append(x)
18
+ yield tuple(window)
@@ -0,0 +1,96 @@
1
+ import functools
2
+ import heapq
3
+ import itertools
4
+ import typing as ta
5
+
6
+ from .iterators import PeekIterator
7
+ from .iterators import PrefetchIterator
8
+
9
+
10
+ T = ta.TypeVar('T')
11
+ U = ta.TypeVar('U')
12
+
13
+
14
+ def unzip(it: ta.Iterable[T], width: int | None = None) -> list:
15
+ if width is None:
16
+ if not isinstance(it, PeekIterator):
17
+ it = PeekIterator(iter(it))
18
+ try:
19
+ width = len(it.peek())
20
+ except StopIteration:
21
+ return []
22
+
23
+ its: list[PrefetchIterator[T]] = []
24
+ running = True
25
+
26
+ def next_fn(idx):
27
+ nonlocal running
28
+ if not running:
29
+ raise StopIteration
30
+ try:
31
+ items = next(it) # type: ignore
32
+ except StopIteration:
33
+ running = False
34
+ raise
35
+ for item_idx, item in enumerate(items):
36
+ its[item_idx].push(item)
37
+ return next(its[idx])
38
+
39
+ its.extend(PrefetchIterator(functools.partial(next_fn, idx)) for idx in range(width))
40
+ return its
41
+
42
+
43
+ def take(n: int, iterable: ta.Iterable[T]) -> list[T]:
44
+ return list(itertools.islice(iterable, n))
45
+
46
+
47
+ def chunk(n: int, iterable: ta.Iterable[T], strict: bool = False) -> ta.Iterator[list[T]]:
48
+ iterator = iter(functools.partial(take, n, iter(iterable)), [])
49
+ if strict:
50
+ def ret():
51
+ for chunk in iterator:
52
+ if len(chunk) != n:
53
+ raise ValueError('iterable is not divisible by n.')
54
+ yield chunk
55
+ return iter(ret())
56
+ else:
57
+ return iterator
58
+
59
+
60
+ def merge_on(
61
+ function: ta.Callable[[T], U],
62
+ *its: ta.Iterable[T],
63
+ ) -> ta.Iterator[tuple[U, list[tuple[int, T]]]]:
64
+ indexed_its = [
65
+ (
66
+ (function(item), it_idx, item)
67
+ for it_idx, item in zip(itertools.repeat(it_idx), it)
68
+ )
69
+ for it_idx, it in enumerate(its)
70
+ ]
71
+
72
+ grouped_indexed_its = itertools.groupby(
73
+ heapq.merge(*indexed_its),
74
+ key=lambda item_tuple: item_tuple[0],
75
+ )
76
+
77
+ return (
78
+ (fn_item, [(it_idx, item) for _, it_idx, item in grp])
79
+ for fn_item, grp in grouped_indexed_its
80
+ )
81
+
82
+
83
+ def expand_indexed_pairs(
84
+ seq: ta.Iterable[tuple[int, T]],
85
+ default: T,
86
+ *,
87
+ width: int | None = None,
88
+ ) -> list[T]:
89
+ width_ = width
90
+ if width_ is None:
91
+ width_ = (max(idx for idx, _ in seq) + 1) if seq else 0
92
+ result = [default] * width_
93
+ for idx, value in seq:
94
+ if idx < width_:
95
+ result[idx] = value
96
+ return result
@@ -0,0 +1,67 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from .. import lang
5
+
6
+
7
+ T = ta.TypeVar('T')
8
+
9
+
10
+ @dc.dataclass()
11
+ class UniqueStats:
12
+ key: ta.Any
13
+ num_seen: int
14
+ first_idx: int
15
+ last_idx: int
16
+
17
+
18
+ @dc.dataclass(frozen=True)
19
+ class UniqueItem(ta.Generic[T]):
20
+ idx: int
21
+ item: T
22
+ stats: UniqueStats
23
+ out: lang.Maybe[T]
24
+
25
+
26
+ class UniqueIterator(ta.Iterator[UniqueItem[T]]):
27
+ def __init__(
28
+ self,
29
+ it: ta.Iterable[T],
30
+ keyer: ta.Callable[[T], ta.Any] = lang.identity,
31
+ ) -> None:
32
+ super().__init__()
33
+ self._it = enumerate(it)
34
+ self._keyer = keyer
35
+
36
+ self.stats: dict[ta.Any, UniqueStats] = {}
37
+
38
+ def __next__(self) -> UniqueItem[T]:
39
+ idx, item = next(self._it)
40
+ key = self._keyer(item)
41
+
42
+ try:
43
+ stats = self.stats[key]
44
+
45
+ except KeyError:
46
+ stats = self.stats[key] = UniqueStats(
47
+ key,
48
+ num_seen=1,
49
+ first_idx=idx,
50
+ last_idx=idx,
51
+ )
52
+ return UniqueItem(
53
+ idx,
54
+ item,
55
+ stats,
56
+ lang.just(item),
57
+ )
58
+
59
+ else:
60
+ stats.num_seen += 1
61
+ stats.last_idx = idx
62
+ return UniqueItem(
63
+ idx,
64
+ item,
65
+ stats,
66
+ lang.empty(),
67
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev164
3
+ Version: 0.0.0.dev166
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- omlish/.manifests.json,sha256=Z-OzsisX-uiidgvNIQIrN92nEPRucZUOhM5lIc52LMY,6568
2
- omlish/__about__.py,sha256=Wq_KXkG_n9_7ClnP_8Us0xVUlCWhTt8qknqNPxvPxgU,3409
1
+ omlish/.manifests.json,sha256=0BnQGD2dcXEma0Jop2ZesvDNzSj3CAJBNq8aTGuBz9A,7276
2
+ omlish/__about__.py,sha256=fXaHA2dVpft8O6khsmrd4euInIFrrMexrl8b4pMj_ME,3409
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
@@ -7,7 +7,6 @@ omlish/check.py,sha256=RzMJhp8_dDnpHXnPiHDyZTW13KGDTopeuMgpwKCowPs,1988
7
7
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
8
8
  omlish/defs.py,sha256=9uUjJuVIbCBL3g14fyzAp-9gH935MFofvlfOGwcBIaM,4913
9
9
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
10
- omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
11
10
  omlish/libc.py,sha256=8r7Ejyhttk9ruCfBkxNTrlzir5WPbDE2vmY7VPlceMA,15362
12
11
  omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
13
12
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
@@ -109,14 +108,14 @@ omlish/bootstrap/harness.py,sha256=VW8YP-yENGyXIuJ8GL_xintArF13nafwpz-iAghPt34,1
109
108
  omlish/bootstrap/main.py,sha256=yZhOHDDlj4xB5a89dRdT8z58FsqqnpoBg1-tvY2CJe4,5903
110
109
  omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
111
110
  omlish/bootstrap/sys.py,sha256=aqMzxZa_lPj78cgz4guYZAkjT6En32e2LptfEo20NIM,8769
112
- omlish/codecs/__init__.py,sha256=dtDRfvZRLM6KSfT0y9GRRPu8kjkMaBM1ItrfQTa84Vk,854
113
- omlish/codecs/base.py,sha256=90e4PJKtBj9AFw0IXlhVLM1jlrDgJmDD-Zy0GFkth1c,2078
111
+ omlish/codecs/__init__.py,sha256=-FDwRJFGagg-fZyQ8wup4GPuR6gHpmaChzthlykn-kY,876
112
+ omlish/codecs/base.py,sha256=O6MDkBg0LDq3W-bVXpNEZiIkTYQo2cwaHFoUwxgtcOk,2208
114
113
  omlish/codecs/bytes.py,sha256=jlZ87OmZ52HhQDNyL87R3OIviK2qV5iU2jZYOTOLWjk,2157
115
114
  omlish/codecs/chain.py,sha256=DrBi5vbaFfObfoppo6alwOmyW2XbrH2051cjExwr2Gs,527
116
- omlish/codecs/funcs.py,sha256=bMcARQUziSiGocaERbfCR71sVw-BcmKfQEns30y_bEc,590
115
+ omlish/codecs/funcs.py,sha256=p4imNt7TobyZVXWC-WhntHVu9KfJrO4QwdtPRh-cVOk,850
117
116
  omlish/codecs/registry.py,sha256=8ySUG-kwGJoUN1HCRnz8VjcykB0wlIzoWF5WTAE1ny0,3860
118
117
  omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
119
- omlish/codecs/text.py,sha256=D8uy-3_XFwUSlygPQsHP8c2t5ZCgebQS0hv5CWoDXCI,5728
118
+ omlish/codecs/text.py,sha256=8inuZbi_ODJB4G6eZfj2wBvCLgtpvhcTebKdGSori5c,5728
120
119
  omlish/collections/__init__.py,sha256=zeUvcAz073ekko37QKya6sElTMfKTuF1bKrdbMtaRpI,2142
121
120
  omlish/collections/abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
122
121
  omlish/collections/coerce.py,sha256=g68ROb_-5HgH-vI8612mU2S0FZ8-wp2ZHK5_Zy_kVC0,7037
@@ -204,6 +203,7 @@ omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,70
204
203
  omlish/docker/timebomb.py,sha256=A_pgIDaXKsQwPiikrCTgIJl91gwYqkPGFY6j-Naq07Q,342
205
204
  omlish/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
205
  omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
206
+ omlish/formats/cloudpickle.py,sha256=16si4yUp_pAdDWGECAWf6HLA2PwSANGGgDoMLGZUem8,579
207
207
  omlish/formats/codecs.py,sha256=6AbKIz_gl_om36-7qsutybYzK8cJP3LzwC9YJlwCPOA,1590
208
208
  omlish/formats/dotenv.py,sha256=qoDG4Ayu7B-8LjBBhcmNiLZW0_9LgCi3Ri2aPo9DEQ8,19314
209
209
  omlish/formats/json5.py,sha256=odpZIShlUpv19aACWe58SoMPcv0AHKIa6zSMjlKgaMI,515
@@ -211,10 +211,11 @@ omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
211
211
  omlish/formats/props.py,sha256=cek3JLFLIrpE76gvs8rs_B8yF4SpY8ooDH8apWsquwE,18953
212
212
  omlish/formats/toml.py,sha256=AhpVNAy87eBohBCsvIvwH2ucASWxnWXMEsMH8zB7rpI,340
213
213
  omlish/formats/xml.py,sha256=ggiOwSERt4d9XmZwLZiDIh5qnFJS4jdmow9m9_9USps,1491
214
- omlish/formats/yaml.py,sha256=2-ULW2fm82cA2L14UNbSHZwYr7b6W3CxjAbIiNnfHz8,7185
214
+ omlish/formats/yaml.py,sha256=ffOwGnLA6chdiFyaS7X0TBMGmHG9AoGudzKVWfQ1UOs,7389
215
215
  omlish/formats/json/__init__.py,sha256=y7T-Jm-7FuQFzb-6uedky0ZhBaKtCKzcu291juXfiWI,669
216
- omlish/formats/json/codecs.py,sha256=0eRmbHPDq1XELuPcgl_vTqJoaHMuCoUitd0GYCntpTY,800
216
+ omlish/formats/json/codecs.py,sha256=E5KErfqsgGZq763ixXLT3qysbk5MIsypT92xG5aSaIs,796
217
217
  omlish/formats/json/consts.py,sha256=A0cTAGGLyjo-gcYIQrL4JIaardI0yPMhQoNmh42BaRg,387
218
+ omlish/formats/json/delimted.py,sha256=UpcTP-KAc6HgMtb9n-Ldgux18OlZjb_9BDFTWol2vo8,29
218
219
  omlish/formats/json/encoding.py,sha256=O4iIWle7W_-RwpOvJNlqOfkbnDyiQHexV5Za4hlrFzw,497
219
220
  omlish/formats/json/json.py,sha256=Mdqv2vdMi7gp96eV0BIYH5UdWpjWfsh-tSMZeywG-08,331
220
221
  omlish/formats/json/literals.py,sha256=6ptwZyfTXodEtAjDnUhsx6XU3KRZWWYWKYtZ8T7rzsQ,5625
@@ -236,7 +237,7 @@ omlish/formats/json/stream/render.py,sha256=NtmDsN92xZi5dkgSSuMeMXMAiJblmjz1arB4
236
237
  omlish/funcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
238
  omlish/funcs/genmachine.py,sha256=EY2k-IFNKMEmHo9CmGRptFvhEMZVOWzZhn0wdQGeaFM,2476
238
239
  omlish/funcs/match.py,sha256=gMLZn1enNiFvQaWrQubY300M1BrmdKWzeePihBS7Ywc,6153
239
- omlish/funcs/pairs.py,sha256=PTqtvZ5ygXHQDBdKUD8_-fC01fG_3qeTK3lH3NcQLnk,10606
240
+ omlish/funcs/pairs.py,sha256=VCkZjDmJGtR76BsejsHNfb4TcpHCtkkmak-zWDFchAo,3904
240
241
  omlish/funcs/pipes.py,sha256=E7Sz8Aj8ke_vCs5AMNwg1I36kRdHVGTnzxVQaDyn43U,2490
241
242
  omlish/graphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
242
243
  omlish/graphs/dags.py,sha256=zp55lYgUdRCxmADwiGDHeehMJczZFA_tzdWqy77icOk,3047
@@ -309,7 +310,7 @@ omlish/io/compress/adapters.py,sha256=DQvbiqTiaVE-GsawpOpUTX07Gjg125Iuwd6IhjuSax
309
310
  omlish/io/compress/base.py,sha256=yx8ifzs_j8y66gMCQcssjZ936NNBFhYn_kBRwNh3SWQ,647
310
311
  omlish/io/compress/brotli.py,sha256=Q2t9uRqBEgRyJCSPsTaJv5w7d-rhsjDMluA4VRBHa_A,1182
311
312
  omlish/io/compress/bz2.py,sha256=2ULaZwcpAkHKV-JargrLoXgL9G-gxrVnPqE_pGqNUrg,1566
312
- omlish/io/compress/codecs.py,sha256=e6jCYVfUbanUzvkWW9IHDK6SbG6dwRLAztTADCWnWEQ,1076
313
+ omlish/io/compress/codecs.py,sha256=ySLHZdNKLx_CiBW9aGIu0gHbALGzF-uyH0usloU7s-8,1820
313
314
  omlish/io/compress/gzip.py,sha256=ZKZdg0wg_nIgFdkfemOv8xZpHneBXZAiCH0n6gIibWY,12281
314
315
  omlish/io/compress/lz4.py,sha256=4kppXZCXpSAQw6wJvCs9LLHFzukekENja7RiwmN8uMc,2790
315
316
  omlish/io/compress/lzma.py,sha256=4bWNKk7uTFiRT_HogW2ZldgaNy1IukmqfVDVkf5M2Ok,2501
@@ -321,11 +322,16 @@ omlish/io/fdio/handlers.py,sha256=OOQhiazbhNMwxLwyzf8KUQrBQSuHIm-UqAMpXmmHGFQ,13
321
322
  omlish/io/fdio/kqueue.py,sha256=YgGBQibkAUYODYDiGl7Enjtx1oQsJXuDsBLBXgqlLQw,3832
322
323
  omlish/io/fdio/manager.py,sha256=q4wWf7nKrNtjx6yPEvrVnFt4UtK_BTvVlquEGw7poEo,1250
323
324
  omlish/io/fdio/pollers.py,sha256=yNadAt3W5wd90PFmd3vD77bq5QwoVb2A6SM2JjZpKRs,5507
324
- omlish/io/generators/__init__.py,sha256=40DTZUqyss40dlgm68yKAtiAlqeIlYylTi8zaFrUW40,1135
325
+ omlish/io/generators/__init__.py,sha256=YsSLJY9uw72eX3iXd_A0pM69g7EvEqMFdCdR_BBD4RA,1216
325
326
  omlish/io/generators/consts.py,sha256=4r6IMLBMic6MJHVn9UiORIkkPAuxsqtzFT3KV0fatC0,33
326
327
  omlish/io/generators/direct.py,sha256=A9VJB1rNKU3l-NatpYIwyCLI3R_ybGglmdx6sAtoTo4,324
327
328
  omlish/io/generators/readers.py,sha256=MolTFCzcnD5XoP0su0YUNHJ0xlHC3KTihvWAi75y8Bo,4336
328
- omlish/io/generators/stepped.py,sha256=wk4vDqOKi_Tr4qMY_FxIGO5dF3Ob-3Uh8UcV_9UYrAg,4677
329
+ omlish/io/generators/stepped.py,sha256=sl-3-hNVYi7qGYZjwBPHs0hKxmz7XkfDMosCXbhIYlE,5025
330
+ omlish/iterators/__init__.py,sha256=yMavf5FofiS1EU4UFuWPXiFZ03W0H-y7MuMxW8FUaEE,358
331
+ omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU,3158
332
+ omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
333
+ omlish/iterators/tools.py,sha256=SvXyyQJh7aceLYhRl6pQB-rfSaXw5IMIWukeEeOZt-0,2492
334
+ omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
329
335
  omlish/lang/__init__.py,sha256=wMfsQjBFNsZ_Y4352iEr0DlEnNebf26JmR4ETtDsQow,3948
330
336
  omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
331
337
  omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
@@ -550,9 +556,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
550
556
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
551
557
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
552
558
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
553
- omlish-0.0.0.dev164.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
554
- omlish-0.0.0.dev164.dist-info/METADATA,sha256=N_hGMWyHlcIuZ7PKUQ_5Z2IJRcFLC6gvVrM_DyweMlQ,4264
555
- omlish-0.0.0.dev164.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
556
- omlish-0.0.0.dev164.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
557
- omlish-0.0.0.dev164.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
558
- omlish-0.0.0.dev164.dist-info/RECORD,,
559
+ omlish-0.0.0.dev166.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
560
+ omlish-0.0.0.dev166.dist-info/METADATA,sha256=k2XolFifVQc4PpG7_98r62S2OP6NpxBerLqcXtxl-tg,4264
561
+ omlish-0.0.0.dev166.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
562
+ omlish-0.0.0.dev166.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
563
+ omlish-0.0.0.dev166.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
564
+ omlish-0.0.0.dev166.dist-info/RECORD,,