omlish 0.0.0.dev286__py3-none-any.whl → 0.0.0.dev287__py3-none-any.whl
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.
- omlish/__about__.py +2 -2
- omlish/collections/persistent/treapmap.py +5 -5
- omlish/collections/ranked.py +8 -2
- omlish/collections/sorted/skiplist.py +1 -1
- omlish/collections/sorted/sorted.py +9 -9
- omlish/dataclasses/internals.py +4 -1
- omlish/dispatch/__init__.py +12 -3
- omlish/dispatch/functions.py +3 -0
- omlish/dispatch/impls.py +10 -13
- omlish/dispatch/methods.py +69 -14
- omlish/iterators/iterators.py +3 -0
- omlish/iterators/recipes.py +3 -0
- omlish/iterators/tools.py +3 -0
- omlish/iterators/unique.py +3 -0
- omlish/lang/__init__.py +4 -0
- omlish/lang/attrs.py +70 -2
- omlish/lang/functions.py +8 -1
- {omlish-0.0.0.dev286.dist-info → omlish-0.0.0.dev287.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev286.dist-info → omlish-0.0.0.dev287.dist-info}/RECORD +23 -23
- {omlish-0.0.0.dev286.dist-info → omlish-0.0.0.dev287.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev286.dist-info → omlish-0.0.0.dev287.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev286.dist-info → omlish-0.0.0.dev287.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev286.dist-info → omlish-0.0.0.dev287.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
@@ -70,11 +70,11 @@ class TreapMap(PersistentMap[K, V]):
|
|
70
70
|
return n.value
|
71
71
|
|
72
72
|
def __iter__(self) -> ta.Iterator[tuple[K, V]]:
|
73
|
-
i = self.
|
73
|
+
i = self.items()
|
74
74
|
while i.has_next():
|
75
75
|
yield i.next()
|
76
76
|
|
77
|
-
def
|
77
|
+
def items(self) -> 'TreapMapIterator[K, V]':
|
78
78
|
i = TreapMapIterator(
|
79
79
|
_st=[],
|
80
80
|
_n=self._n,
|
@@ -84,7 +84,7 @@ class TreapMap(PersistentMap[K, V]):
|
|
84
84
|
i._n = n.left # noqa
|
85
85
|
return i
|
86
86
|
|
87
|
-
def
|
87
|
+
def items_from(self, k: K) -> 'TreapMapIterator[K, V]':
|
88
88
|
lst = treap.place(self._n, (k, None), self._c) # type: ignore
|
89
89
|
i = TreapMapIterator(
|
90
90
|
_st=lst,
|
@@ -92,7 +92,7 @@ class TreapMap(PersistentMap[K, V]):
|
|
92
92
|
)
|
93
93
|
return i
|
94
94
|
|
95
|
-
def
|
95
|
+
def items_desc(self) -> 'TreapMapReverseIterator[K, V]':
|
96
96
|
i = TreapMapReverseIterator(
|
97
97
|
_st=[],
|
98
98
|
_n=self._n,
|
@@ -102,7 +102,7 @@ class TreapMap(PersistentMap[K, V]):
|
|
102
102
|
i._n = n.right # noqa
|
103
103
|
return i
|
104
104
|
|
105
|
-
def
|
105
|
+
def items_from_desc(self, k: K) -> 'TreapMapReverseIterator[K, V]':
|
106
106
|
lst = treap.place(self._n, (k, None), self._c, desc=True) # type: ignore
|
107
107
|
i = TreapMapReverseIterator(
|
108
108
|
_st=lst,
|
omlish/collections/ranked.py
CHANGED
@@ -15,7 +15,10 @@ class RankedSeq(ta.Sequence[T]):
|
|
15
15
|
super().__init__()
|
16
16
|
|
17
17
|
self._lst = list(it)
|
18
|
-
self._ranks: ta.Mapping[T, int] = (
|
18
|
+
self._ranks: ta.Mapping[T, int] = (
|
19
|
+
(IdentityKeyDict if identity else dict)
|
20
|
+
((e, i) for i, e in enumerate(self._lst))
|
21
|
+
)
|
19
22
|
if len(self._ranks) != len(self._lst):
|
20
23
|
raise ValueError(f'{len(self._ranks)} != {len(self._lst)}')
|
21
24
|
|
@@ -51,7 +54,10 @@ class RankedSetSeq(ta.Sequence[ta.AbstractSet[T]]):
|
|
51
54
|
super().__init__()
|
52
55
|
|
53
56
|
self._lst = [(IdentitySet if identity else set)(e) for e in it]
|
54
|
-
self._ranks: ta.Mapping[T, int] = (
|
57
|
+
self._ranks: ta.Mapping[T, int] = (
|
58
|
+
(IdentityKeyDict if identity else dict)
|
59
|
+
((e, i) for i, es in enumerate(self._lst) for e in es)
|
60
|
+
)
|
55
61
|
if len(self._ranks) != sum(map(len, self._lst)):
|
56
62
|
raise ValueError(f'{len(self._ranks)} != {sum(map(len, self._lst))}')
|
57
63
|
|
@@ -182,7 +182,7 @@ class SkipList(SortedCollection[T]):
|
|
182
182
|
yield cur.value # type: ignore
|
183
183
|
cur = cur.next[0]
|
184
184
|
|
185
|
-
def
|
185
|
+
def iter_desc(self, base: T | None = None) -> ta.Iterable[T]:
|
186
186
|
if base is not None:
|
187
187
|
cur = self._find(base)
|
188
188
|
while cur is not self._head and self._compare(base, cur.value) < 0: # type: ignore
|
@@ -51,7 +51,7 @@ class SortedCollection(lang.Abstract, ta.Collection[T]):
|
|
51
51
|
raise NotImplementedError
|
52
52
|
|
53
53
|
@abc.abstractmethod
|
54
|
-
def
|
54
|
+
def iter_desc(self, base: T | None = None) -> ta.Iterable[T]:
|
55
55
|
raise NotImplementedError
|
56
56
|
|
57
57
|
|
@@ -61,15 +61,15 @@ class SortedMapping(ta.Mapping[K, V]):
|
|
61
61
|
raise NotImplementedError
|
62
62
|
|
63
63
|
@abc.abstractmethod
|
64
|
-
def
|
64
|
+
def items_desc(self) -> ta.Iterator[tuple[K, V]]:
|
65
65
|
raise NotImplementedError
|
66
66
|
|
67
67
|
@abc.abstractmethod
|
68
|
-
def
|
68
|
+
def items_from(self, key: K) -> ta.Iterator[tuple[K, V]]:
|
69
69
|
raise NotImplementedError
|
70
70
|
|
71
71
|
@abc.abstractmethod
|
72
|
-
def
|
72
|
+
def items_from_desc(self, key: K) -> ta.Iterator[tuple[K, V]]:
|
73
73
|
raise NotImplementedError
|
74
74
|
|
75
75
|
|
@@ -115,11 +115,11 @@ class SortedListDict(SortedMutableMapping[K, V]):
|
|
115
115
|
def items(self) -> ta.Iterator[tuple[K, V]]: # type: ignore
|
116
116
|
yield from self._impl.iter()
|
117
117
|
|
118
|
-
def
|
119
|
-
yield from self._impl.
|
118
|
+
def items_desc(self) -> ta.Iterator[tuple[K, V]]:
|
119
|
+
yield from self._impl.iter_desc()
|
120
120
|
|
121
|
-
def
|
121
|
+
def items_from(self, key: K) -> ta.Iterator[tuple[K, V]]:
|
122
122
|
yield from self._impl.iter((key, None))
|
123
123
|
|
124
|
-
def
|
125
|
-
yield from self._impl.
|
124
|
+
def items_from_desc(self, key: K) -> ta.Iterator[tuple[K, V]]:
|
125
|
+
yield from self._impl.iter_desc((key, None))
|
omlish/dataclasses/internals.py
CHANGED
@@ -75,9 +75,12 @@ class StdFieldType(enum.Enum):
|
|
75
75
|
INIT_VAR = dc._FIELD_INITVAR # type: ignore # noqa
|
76
76
|
|
77
77
|
|
78
|
+
STD_FIELD_TYPE_MAP: ta.Mapping[ta.Any, StdFieldType] = {v.value: v for v in StdFieldType}
|
79
|
+
|
80
|
+
|
78
81
|
def std_field_type(f: dc.Field) -> StdFieldType:
|
79
82
|
if (ft := getattr(f, '_field_type')) is not None:
|
80
|
-
return
|
83
|
+
return STD_FIELD_TYPE_MAP[ft]
|
81
84
|
else:
|
82
85
|
return StdFieldType.INSTANCE
|
83
86
|
|
omlish/dispatch/__init__.py
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
-
from .dispatch import
|
2
|
-
|
3
|
-
|
1
|
+
from .dispatch import ( # noqa
|
2
|
+
Dispatcher,
|
3
|
+
)
|
4
|
+
|
5
|
+
from .functions import ( # noqa
|
6
|
+
function,
|
7
|
+
)
|
8
|
+
|
9
|
+
from .methods import ( # noqa
|
10
|
+
install_method,
|
11
|
+
method,
|
12
|
+
)
|
omlish/dispatch/functions.py
CHANGED
omlish/dispatch/impls.py
CHANGED
@@ -5,8 +5,8 @@ TODO:
|
|
5
5
|
- multidispatch? never solved..
|
6
6
|
- just generic on tuple[A0, A1, ...]
|
7
7
|
"""
|
8
|
+
import inspect
|
8
9
|
import typing as ta
|
9
|
-
import weakref
|
10
10
|
|
11
11
|
from .. import c3
|
12
12
|
from .. import check
|
@@ -19,15 +19,7 @@ T = ta.TypeVar('T')
|
|
19
19
|
##
|
20
20
|
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
def get_impl_func_cls_set(func: ta.Callable) -> frozenset[type]:
|
26
|
-
try:
|
27
|
-
return _IMPL_FUNC_CLS_SET_CACHE[func]
|
28
|
-
except KeyError:
|
29
|
-
pass
|
30
|
-
|
22
|
+
def get_impl_func_cls_set(func: ta.Callable, *, arg_offset: int = 0) -> frozenset[type]:
|
31
23
|
ann = getattr(func, '__annotations__', {})
|
32
24
|
if not ann:
|
33
25
|
raise TypeError(f'Invalid impl func: {func!r}')
|
@@ -39,8 +31,11 @@ def get_impl_func_cls_set(func: ta.Callable) -> frozenset[type]:
|
|
39
31
|
return check.isinstance(a, type)
|
40
32
|
|
41
33
|
# Exclude 'return' to support difficult to handle return types - they are unimportant.
|
42
|
-
|
43
|
-
|
34
|
+
th_dct = rfl.get_filtered_type_hints(func, exclude=['return'])
|
35
|
+
|
36
|
+
ps = inspect.signature(func).parameters
|
37
|
+
p = list(ps.values())[arg_offset]
|
38
|
+
cls = th_dct[p.name]
|
44
39
|
|
45
40
|
rty = rfl.type_(cls)
|
46
41
|
if isinstance(rty, rfl.Union):
|
@@ -48,10 +43,12 @@ def get_impl_func_cls_set(func: ta.Callable) -> frozenset[type]:
|
|
48
43
|
else:
|
49
44
|
ret = frozenset([erase(rty)])
|
50
45
|
|
51
|
-
_IMPL_FUNC_CLS_SET_CACHE[func] = ret
|
52
46
|
return ret
|
53
47
|
|
54
48
|
|
49
|
+
##
|
50
|
+
|
51
|
+
|
55
52
|
def find_impl(cls: type, registry: ta.Mapping[type, T]) -> T | None:
|
56
53
|
mro = c3.compose_mro(cls, registry.keys())
|
57
54
|
|
omlish/dispatch/methods.py
CHANGED
@@ -18,14 +18,25 @@ from .impls import get_impl_func_cls_set
|
|
18
18
|
T = ta.TypeVar('T')
|
19
19
|
|
20
20
|
|
21
|
+
##
|
22
|
+
|
23
|
+
|
21
24
|
class Method:
|
22
|
-
def __init__(
|
25
|
+
def __init__(
|
26
|
+
self,
|
27
|
+
func: ta.Callable,
|
28
|
+
*,
|
29
|
+
installable: bool = False,
|
30
|
+
) -> None:
|
31
|
+
super().__init__()
|
32
|
+
|
23
33
|
if not callable(func) and not hasattr(func, '__get__'): # type: ignore
|
24
34
|
raise TypeError(f'{func!r} is not callable or a descriptor')
|
25
35
|
|
26
36
|
self._func = func
|
37
|
+
self._installable = installable
|
27
38
|
|
28
|
-
self._impls: ta.
|
39
|
+
self._impls: ta.MutableMapping[ta.Callable, frozenset[type] | None] = weakref.WeakKeyDictionary()
|
29
40
|
|
30
41
|
# bpo-45678: special-casing for classmethod/staticmethod in Python <=3.9, as functools.update_wrapper doesn't
|
31
42
|
# work properly in singledispatchmethod.__get__ if it is applied to an unbound classmethod/staticmethod
|
@@ -48,6 +59,15 @@ class Method:
|
|
48
59
|
|
49
60
|
self._dispatch_func_cache_remove = dispatch_func_cache_remove
|
50
61
|
|
62
|
+
self._owner: type | None = None
|
63
|
+
self._name: str | None = None
|
64
|
+
|
65
|
+
def __set_name__(self, owner, name):
|
66
|
+
if self._owner is None:
|
67
|
+
self._owner = owner
|
68
|
+
if self._name is None:
|
69
|
+
self._name = name
|
70
|
+
|
51
71
|
def __repr__(self) -> str:
|
52
72
|
return f'<{type(self).__module__}.{type(self).__qualname__}:{self._func} at 0x{id(self):x}>'
|
53
73
|
|
@@ -61,7 +81,7 @@ class Method:
|
|
61
81
|
setattr(wrapper, '__isabstractmethod__', self._is_abstractmethod) # noqa
|
62
82
|
return wrapper
|
63
83
|
|
64
|
-
def register(self, impl: T) -> T:
|
84
|
+
def register(self, impl: T, cls_set: frozenset[type] | None = None) -> T:
|
65
85
|
# bpo-39679: in Python <= 3.9, classmethods and staticmethods don't inherit __annotations__ of the wrapped
|
66
86
|
# function (fixed in 3.10+ as a side-effect of bpo-43682) but we need that for annotation-derived
|
67
87
|
# singledispatches. So we add that just-in-time here.
|
@@ -70,7 +90,7 @@ class Method:
|
|
70
90
|
|
71
91
|
check.callable(impl)
|
72
92
|
if impl not in self._impls:
|
73
|
-
self._impls
|
93
|
+
self._impls[impl] = cls_set # type: ignore
|
74
94
|
self._dispatch_func_cache.clear()
|
75
95
|
|
76
96
|
return impl
|
@@ -85,14 +105,23 @@ class Method:
|
|
85
105
|
hash(att)
|
86
106
|
except TypeError:
|
87
107
|
continue
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
108
|
+
|
109
|
+
if att not in self._impls:
|
110
|
+
continue
|
111
|
+
cls_set = self._impls[att]
|
112
|
+
|
113
|
+
if cls_set is None:
|
114
|
+
cls_set = get_impl_func_cls_set(att, arg_offset=1)
|
115
|
+
self._impls[att] = cls_set
|
116
|
+
|
117
|
+
try:
|
118
|
+
ex_nam = seen[att]
|
119
|
+
except KeyError:
|
120
|
+
pass
|
121
|
+
else:
|
122
|
+
raise TypeError(f'Duplicate impl: {owner_cls} {instance_cls} {nam} {ex_nam}')
|
123
|
+
|
124
|
+
disp.register(nam, cls_set)
|
96
125
|
|
97
126
|
return disp
|
98
127
|
|
@@ -106,9 +135,11 @@ class Method:
|
|
106
135
|
def __call__(self, *args, **kwargs): # noqa
|
107
136
|
if not args:
|
108
137
|
raise TypeError(f'{func_name} requires at least 1 positional argument')
|
138
|
+
|
109
139
|
if (impl_att := dispatch(type_(args[0]))) is not None:
|
110
140
|
fn = getattr_(self, impl_att)
|
111
141
|
return fn(*args, **kwargs)
|
142
|
+
|
112
143
|
return base_func.__get__(self)(*args, **kwargs) # noqa
|
113
144
|
|
114
145
|
self.update_wrapper(__call__)
|
@@ -148,5 +179,29 @@ class Method:
|
|
148
179
|
return func.__get__(instance)(*args, **kwargs) # noqa
|
149
180
|
|
150
181
|
|
151
|
-
def method(func): # noqa
|
152
|
-
|
182
|
+
def method(func=None, /, *, installable=False): # noqa
|
183
|
+
kw = dict(installable=installable)
|
184
|
+
if func is None:
|
185
|
+
return functools.partial(Method, **kw)
|
186
|
+
return Method(func, **kw)
|
187
|
+
|
188
|
+
|
189
|
+
def install_method(mth: ta.Any, *, name: str | None = None) -> ta.Callable[[T], T]:
|
190
|
+
mth = check.isinstance(mth, Method)
|
191
|
+
if not mth._installable: # noqa
|
192
|
+
raise TypeError(f'Method not installable: {mth}')
|
193
|
+
|
194
|
+
def inner(fn):
|
195
|
+
a = name
|
196
|
+
if a is None:
|
197
|
+
a = fn.__name__
|
198
|
+
|
199
|
+
cls: type = check.not_none(mth._owner) # noqa
|
200
|
+
check.arg(not hasattr(cls, a))
|
201
|
+
setattr(cls, a, fn)
|
202
|
+
|
203
|
+
mth.register(fn)
|
204
|
+
|
205
|
+
return fn
|
206
|
+
|
207
|
+
return inner
|
omlish/iterators/iterators.py
CHANGED
omlish/iterators/recipes.py
CHANGED
omlish/iterators/tools.py
CHANGED
omlish/iterators/unique.py
CHANGED
omlish/lang/__init__.py
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
from .attrs import ( # noqa
|
2
2
|
AttrOps,
|
3
|
+
AttributePresentError,
|
3
4
|
DictAttrOps,
|
4
5
|
STD_ATTR_OPS,
|
6
|
+
SetAttrIfPresent,
|
5
7
|
StdAttrOps,
|
6
8
|
TRANSIENT_ATTR_OPS,
|
7
9
|
TransientAttrOps,
|
8
10
|
TransientDict,
|
11
|
+
set_attr,
|
9
12
|
transient_delattr,
|
10
13
|
transient_getattr,
|
11
14
|
transient_setattr,
|
@@ -130,6 +133,7 @@ from .functions import ( # noqa
|
|
130
133
|
Args,
|
131
134
|
VoidError,
|
132
135
|
as_async,
|
136
|
+
call_with,
|
133
137
|
coalesce,
|
134
138
|
constant,
|
135
139
|
finally_,
|
omlish/lang/attrs.py
CHANGED
@@ -1,8 +1,76 @@
|
|
1
1
|
import abc
|
2
2
|
import collections.abc
|
3
|
+
import functools
|
3
4
|
import typing as ta
|
4
5
|
|
5
6
|
|
7
|
+
T = ta.TypeVar('T')
|
8
|
+
|
9
|
+
|
10
|
+
##
|
11
|
+
|
12
|
+
|
13
|
+
class AttributePresentError(Exception):
|
14
|
+
pass
|
15
|
+
|
16
|
+
|
17
|
+
SetAttrIfPresent: ta.TypeAlias = ta.Literal['overwrite', 'leave', 'raise']
|
18
|
+
|
19
|
+
|
20
|
+
_NO_SET_ATTR_VALUE = object()
|
21
|
+
|
22
|
+
|
23
|
+
@ta.overload
|
24
|
+
def set_attr(
|
25
|
+
obj: ta.Any,
|
26
|
+
name: str,
|
27
|
+
*,
|
28
|
+
if_present: SetAttrIfPresent = 'overwrite',
|
29
|
+
) -> ta.Callable[[T], T]:
|
30
|
+
...
|
31
|
+
|
32
|
+
|
33
|
+
@ta.overload
|
34
|
+
def set_attr(
|
35
|
+
obj: ta.Any,
|
36
|
+
name: str,
|
37
|
+
value: T,
|
38
|
+
*,
|
39
|
+
if_present: SetAttrIfPresent = 'overwrite',
|
40
|
+
) -> T:
|
41
|
+
...
|
42
|
+
|
43
|
+
|
44
|
+
def set_attr(
|
45
|
+
obj,
|
46
|
+
name,
|
47
|
+
value=_NO_SET_ATTR_VALUE,
|
48
|
+
*,
|
49
|
+
if_present='overwrite',
|
50
|
+
):
|
51
|
+
if value is _NO_SET_ATTR_VALUE:
|
52
|
+
return functools.partial(
|
53
|
+
set_attr,
|
54
|
+
obj,
|
55
|
+
name,
|
56
|
+
if_present=if_present,
|
57
|
+
)
|
58
|
+
|
59
|
+
if hasattr(obj, name):
|
60
|
+
if if_present == 'overwrite':
|
61
|
+
pass
|
62
|
+
elif if_present == 'leave':
|
63
|
+
return value
|
64
|
+
elif if_present == 'raise':
|
65
|
+
raise AttributePresentError(name)
|
66
|
+
else:
|
67
|
+
raise ValueError(if_present)
|
68
|
+
|
69
|
+
setattr(obj, name, value)
|
70
|
+
|
71
|
+
return value
|
72
|
+
|
73
|
+
|
6
74
|
##
|
7
75
|
|
8
76
|
|
@@ -24,7 +92,7 @@ class AttrOps(abc.ABC):
|
|
24
92
|
raise NotImplementedError
|
25
93
|
|
26
94
|
|
27
|
-
|
95
|
+
#
|
28
96
|
|
29
97
|
|
30
98
|
class StdAttrOps(AttrOps):
|
@@ -44,7 +112,7 @@ class StdAttrOps(AttrOps):
|
|
44
112
|
STD_ATTR_OPS = StdAttrOps()
|
45
113
|
|
46
114
|
|
47
|
-
|
115
|
+
#
|
48
116
|
|
49
117
|
|
50
118
|
class DictAttrOps(AttrOps):
|
omlish/lang/functions.py
CHANGED
@@ -22,7 +22,14 @@ def is_lambda(f: ta.Any) -> bool:
|
|
22
22
|
##
|
23
23
|
|
24
24
|
|
25
|
-
def
|
25
|
+
def call_with(fn: ta.Any, *args: ta.Any, **kwargs: ta.Any) -> ta.Callable[[T], T]:
|
26
|
+
def inner(obj):
|
27
|
+
fn(obj, *args, **kwargs)
|
28
|
+
return obj
|
29
|
+
return inner
|
30
|
+
|
31
|
+
|
32
|
+
def maybe_call(obj: ta.Any, att: str, *args, default: ta.Any = None, **kwargs: ta.Any) -> ta.Any:
|
26
33
|
try:
|
27
34
|
fn = getattr(obj, att)
|
28
35
|
except AttributeError:
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=pjGUyLHaoWpPqRP3jz2u1fC1qoRc2lvrEcpU_Ax2tdg,8253
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=i-F-KstjC74KdNV4E5DhZUVUlbu5XeNyaWrDZaDrQtw,3444
|
3
3
|
omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
|
4
4
|
omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
|
5
5
|
omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
|
@@ -153,7 +153,7 @@ omlish/collections/hasheq.py,sha256=swOBPEnU_C0SU3VqWJX9mr0BfZLD0A-4Ke9Vahj3fE4,
|
|
153
153
|
omlish/collections/identity.py,sha256=xtoczgBPYzr6r2lJS-eti2kEnN8rVDvNGDCG3TA6vRo,3405
|
154
154
|
omlish/collections/mappings.py,sha256=iXb7oq1rCQak0KgzblgrzWCJLrkfJAYHFvl9lprOVUI,2804
|
155
155
|
omlish/collections/ordered.py,sha256=7zTbrAt12rf6i33XHkQERKar258fJacaw_WbtGEBgWo,2338
|
156
|
-
omlish/collections/ranked.py,sha256=
|
156
|
+
omlish/collections/ranked.py,sha256=McB8C2UQfUvrbmxGTpBz1-EZuyCLkBFtktzncMdt8_Y,2287
|
157
157
|
omlish/collections/unmodifiable.py,sha256=X7kKhPFdZF4m28SfLDxZL-riWlhbZffdPv35aTP30YM,4753
|
158
158
|
omlish/collections/utils.py,sha256=voqecDPFuqSLN8IwJDKyy-HnecEU4JYOXxd1HAaEuMY,2900
|
159
159
|
omlish/collections/cache/__init__.py,sha256=D1gO71VcwxFTZP9gAc9isHfg_TEdalwhsJcgGLvS9hg,233
|
@@ -170,10 +170,10 @@ omlish/collections/kv/wrappers.py,sha256=nUtoiArK1Fu2TgxFrqZU69bEoAxKJ_nA7qMeeih
|
|
170
170
|
omlish/collections/persistent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
171
171
|
omlish/collections/persistent/persistent.py,sha256=6CuzeZjZMqBLflU-CuWu32SrtZXFrJOV-H_UUuYoTkg,880
|
172
172
|
omlish/collections/persistent/treap.py,sha256=o7vhnn8kHde_Plk0sojlJZkkKwp8hpj2IekhcvbYqHs,7739
|
173
|
-
omlish/collections/persistent/treapmap.py,sha256=
|
173
|
+
omlish/collections/persistent/treapmap.py,sha256=lLxjHeR5pFFperrlw3tKIpe20xtszETG3_26EMAwhB4,5793
|
174
174
|
omlish/collections/sorted/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
175
|
-
omlish/collections/sorted/skiplist.py,sha256=
|
176
|
-
omlish/collections/sorted/sorted.py,sha256=
|
175
|
+
omlish/collections/sorted/skiplist.py,sha256=4BqAAxOAb0VM33bny-rdrFM9d2jVbyxsN7yHz3jrqG4,6035
|
176
|
+
omlish/collections/sorted/sorted.py,sha256=IWQm5uyxuskCoX1fCtlBcYlGKdyxQQNMwnTj__eoZS8,3356
|
177
177
|
omlish/concurrent/__init__.py,sha256=9p-s8MvBEYDqHIoYU3OYoe-Nni22QdkW7nhZGEukJTM,197
|
178
178
|
omlish/concurrent/executors.py,sha256=mF-rjJWzNFxwB1-_H7rHuwoImpl4FtNM6W3wcqM3NEE,1291
|
179
179
|
omlish/concurrent/futures.py,sha256=870tx8ELI8THvMnTrQoYIlEFKO9hM4KUrlehckJqKBU,4238
|
@@ -206,7 +206,7 @@ omlish/dataclasses/__init__.py,sha256=xo5rJYrQ2JE5jcX4fHv5e9bC6RIXFd-K8yurUP20oO
|
|
206
206
|
omlish/dataclasses/debug.py,sha256=giBiv6aXvX0IagwNCW64qBzNjfOFr3-VmgDy_KYlb-k,29
|
207
207
|
omlish/dataclasses/errors.py,sha256=tyv3WR6az66uGGiq9FIuCHvy1Ef-G7zeMY7mMG6hy2Y,2527
|
208
208
|
omlish/dataclasses/inspect.py,sha256=BlpPghVCU3w_YDnONEqqE99YHzJM2q3eoqe39YX25Ko,4596
|
209
|
-
omlish/dataclasses/internals.py,sha256=
|
209
|
+
omlish/dataclasses/internals.py,sha256=vIGCZnStgD3ef4drYRtVOrxhxmAPa0vJpo4pXcDcQvM,3073
|
210
210
|
omlish/dataclasses/reflection.py,sha256=5N4acL27xwSnQJvoks6ts2JseGfwL_P9D2gM9vqtAFM,2243
|
211
211
|
omlish/dataclasses/specs.py,sha256=h9qD2xAijKAS95Iw3GUPx3mj1peoUOlgh7aXtqVfmDU,6073
|
212
212
|
omlish/dataclasses/utils.py,sha256=_1B6tEkkcxHVoLBEo34ebR_0E-iZW7W0zFTo27EdSqY,1854
|
@@ -286,13 +286,13 @@ omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8Vni
|
|
286
286
|
omlish/diag/replserver/__main__.py,sha256=LmU41lQ58bm1h4Mx7S8zhE_uEBSC6kPcp9mn5JRpulA,32
|
287
287
|
omlish/diag/replserver/console.py,sha256=XzBDVhYlr8FY6ym4OwoaIHuFOHnGK3dTYlMDIOMUUlA,7410
|
288
288
|
omlish/diag/replserver/server.py,sha256=pqJZXKnD-Cc03hnL_FNqGYaW9kH-IM3e11vCyDAcBD8,5374
|
289
|
-
omlish/dispatch/__init__.py,sha256=
|
289
|
+
omlish/dispatch/__init__.py,sha256=UwVT6SSk5HKk9xF9vc_UJD8BDSIQWSw98Ldx-G-6PC0,166
|
290
290
|
omlish/dispatch/_dispatch2.py,sha256=70k1tKKvuhxtAu6v4skECfHKIKVWrmlt7G_JKLUsKEs,1966
|
291
291
|
omlish/dispatch/_dispatch3.py,sha256=9Zjd7bINAC3keiaBdssc4v5dY0-8OI6XooV2DR9U7Z0,2818
|
292
292
|
omlish/dispatch/dispatch.py,sha256=KA5l49AiGLRjp4J7RDJW9RiDp9WUD1ewR1AOPEF8g38,3062
|
293
|
-
omlish/dispatch/functions.py,sha256=
|
294
|
-
omlish/dispatch/impls.py,sha256=
|
295
|
-
omlish/dispatch/methods.py,sha256=
|
293
|
+
omlish/dispatch/functions.py,sha256=cwNzGIg2ZIalEgn9I03cnJVbMTHjWloyDTaowlO3UPs,1524
|
294
|
+
omlish/dispatch/impls.py,sha256=K_okKvpZml4NkTHJmTVyMQSrIaIJcqTEgkreGwukaOw,1895
|
295
|
+
omlish/dispatch/methods.py,sha256=7jNKvwGNW9CJRTMDZyedmrWJN7Y9-ToI7YOAQ8VJu5Q,6786
|
296
296
|
omlish/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
297
297
|
omlish/docker/all.py,sha256=xXRgJgLGPwAtr7bDMJ_Dp9jTfOwfGvohNhc6LsoELJc,514
|
298
298
|
omlish/docker/cli.py,sha256=gtb9kitVfGnd4cr587NsVVk8D5Ok5y5SAsqD_SwGrSA,2565
|
@@ -455,12 +455,12 @@ omlish/io/fdio/kqueue.py,sha256=YgGBQibkAUYODYDiGl7Enjtx1oQsJXuDsBLBXgqlLQw,3832
|
|
455
455
|
omlish/io/fdio/manager.py,sha256=q4wWf7nKrNtjx6yPEvrVnFt4UtK_BTvVlquEGw7poEo,1250
|
456
456
|
omlish/io/fdio/pollers.py,sha256=yNadAt3W5wd90PFmd3vD77bq5QwoVb2A6SM2JjZpKRs,5507
|
457
457
|
omlish/iterators/__init__.py,sha256=yMavf5FofiS1EU4UFuWPXiFZ03W0H-y7MuMxW8FUaEE,358
|
458
|
-
omlish/iterators/iterators.py,sha256=
|
459
|
-
omlish/iterators/recipes.py,sha256=
|
460
|
-
omlish/iterators/tools.py,sha256=
|
461
|
-
omlish/iterators/unique.py,sha256=
|
462
|
-
omlish/lang/__init__.py,sha256=
|
463
|
-
omlish/lang/attrs.py,sha256=
|
458
|
+
omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8,3159
|
459
|
+
omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
|
460
|
+
omlish/iterators/tools.py,sha256=c4hArZEVV8y9_dFfmRwakusv1cWJLT4MkTkGRjnGN5U,2556
|
461
|
+
omlish/iterators/unique.py,sha256=Nw0pSaNEcHAkve0ugfLPvJcirDOn9ECyC5wIL8JlJKI,1395
|
462
|
+
omlish/lang/__init__.py,sha256=hv6BlnJfD7gHFyOGXl1lgbo3vHkmsivqy462JwA04tM,5316
|
463
|
+
omlish/lang/attrs.py,sha256=i7euRF81uNF8QDmUVXSK_BtqLGshaMi4VVdUnMjiMwg,5050
|
464
464
|
omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
|
465
465
|
omlish/lang/collections.py,sha256=aGi0j6VzVe2nz4l357Y4RD5_XNl8OJbmM5qM6BclrrY,1895
|
466
466
|
omlish/lang/comparison.py,sha256=MOwEG0Yny-jBPHO9kQto9FSRyeNpQW24UABsghkrHxY,1356
|
@@ -468,7 +468,7 @@ omlish/lang/contextmanagers.py,sha256=UPH6daYwSP9cH5AfSVsJyEHk1UURMGhVPM5ZRhp_Hv
|
|
468
468
|
omlish/lang/datetimes.py,sha256=mrTtA67JYpfQwSlzdPcBtvm6dAyYM_dXNnlxFwFQH0M,228
|
469
469
|
omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,6572
|
470
470
|
omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
|
471
|
-
omlish/lang/functions.py,sha256=
|
471
|
+
omlish/lang/functions.py,sha256=bg2IxTFmd_J22qF3XWIRBvSIpLwPRiH_KxGXcm0QVrc,5944
|
472
472
|
omlish/lang/generators.py,sha256=5tbjVAywiZH6oAdj1sJLRMtIkC9y3rAkecLT7Z3m7_g,5251
|
473
473
|
omlish/lang/imports.py,sha256=aC1u2eTrxHhhxShKbJvXswe3aJ7K76vT4YK8LrsvRWU,10476
|
474
474
|
omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
|
@@ -830,9 +830,9 @@ omlish/typedvalues/holder.py,sha256=4SwRezsmuDDEO5gENGx8kTm30pblF5UktoEAu02i-Gk,
|
|
830
830
|
omlish/typedvalues/marshal.py,sha256=Rr-4DZ90BoD5Z9gT18QhZH2yMA3-gPJBK8GUrGkp8VA,4245
|
831
831
|
omlish/typedvalues/reflect.py,sha256=y_7IY8_4cLVRvD3ug-_-cDaO5RtzC1rLVFzkeAPALf8,683
|
832
832
|
omlish/typedvalues/values.py,sha256=Q_5IiQM3Vka4wGVd-scaslb4-oCMjFcIOksIrKE-JIM,1229
|
833
|
-
omlish-0.0.0.
|
834
|
-
omlish-0.0.0.
|
835
|
-
omlish-0.0.0.
|
836
|
-
omlish-0.0.0.
|
837
|
-
omlish-0.0.0.
|
838
|
-
omlish-0.0.0.
|
833
|
+
omlish-0.0.0.dev287.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
834
|
+
omlish-0.0.0.dev287.dist-info/METADATA,sha256=2lOtfXV-sPk2hcxlOFk_TruhqdiAsg_MTdrhMSxI0o0,4316
|
835
|
+
omlish-0.0.0.dev287.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
836
|
+
omlish-0.0.0.dev287.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
837
|
+
omlish-0.0.0.dev287.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
838
|
+
omlish-0.0.0.dev287.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|