omlish 0.0.0.dev97__py3-none-any.whl → 0.0.0.dev99__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 +4 -4
- omlish/cached.py +11 -0
- omlish/collections/__init__.py +7 -0
- omlish/collections/hasheq.py +155 -0
- omlish/fnpairs.py +8 -10
- omlish/lang/__init__.py +1 -0
- omlish/lang/classes/__init__.py +1 -0
- omlish/lang/classes/abstract.py +13 -0
- {omlish-0.0.0.dev97.dist-info → omlish-0.0.0.dev99.dist-info}/METADATA +5 -5
- {omlish-0.0.0.dev97.dist-info → omlish-0.0.0.dev99.dist-info}/RECORD +14 -13
- {omlish-0.0.0.dev97.dist-info → omlish-0.0.0.dev99.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev97.dist-info → omlish-0.0.0.dev99.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev97.dist-info → omlish-0.0.0.dev99.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev97.dist-info → omlish-0.0.0.dev99.dist-info}/top_level.txt +0 -0
    
        omlish/__about__.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
            -
            __version__ = '0.0.0. | 
| 2 | 
            -
            __revision__ = ' | 
| 1 | 
            +
            __version__ = '0.0.0.dev99'
         | 
| 2 | 
            +
            __revision__ = '68bd172d5acce0086e88d20a01fe294fc1fc390c'
         | 
| 3 3 |  | 
| 4 4 |  | 
| 5 5 | 
             
            #
         | 
| @@ -47,7 +47,7 @@ class Project(ProjectBase): | |
| 47 47 |  | 
| 48 48 | 
             
                        'python-snappy ~= 0.7',
         | 
| 49 49 |  | 
| 50 | 
            -
                        ' | 
| 50 | 
            +
                        'zstandard ~= 0.23',
         | 
| 51 51 | 
             
                    ],
         | 
| 52 52 |  | 
| 53 53 | 
             
                    'diag': [
         | 
| @@ -67,7 +67,7 @@ class Project(ProjectBase): | |
| 67 67 |  | 
| 68 68 | 
             
                        'cbor2 ~= 5.6',
         | 
| 69 69 |  | 
| 70 | 
            -
                        'cloudpickle ~= 3. | 
| 70 | 
            +
                        'cloudpickle ~= 3.1',
         | 
| 71 71 | 
             
                    ],
         | 
| 72 72 |  | 
| 73 73 | 
             
                    'http': [
         | 
    
        omlish/cached.py
    CHANGED
    
    | @@ -1,3 +1,14 @@ | |
| 1 | 
            +
            """
         | 
| 2 | 
            +
            This module solely exists for import convenience - tools will tend to resolve the imported 'property' as if it were from
         | 
| 3 | 
            +
            builtins and thus not distinguish it from a normal property.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                from omlish import cached
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                class C:
         | 
| 8 | 
            +
                    @cached.property
         | 
| 9 | 
            +
                    def p(self) -> str: ...
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            """
         | 
| 1 12 | 
             
            from .lang.cached import _CachedProperty  # noqa
         | 
| 2 13 | 
             
            from .lang.cached import cached_function
         | 
| 3 14 |  | 
    
        omlish/collections/__init__.py
    CHANGED
    
    
| @@ -0,0 +1,155 @@ | |
| 1 | 
            +
            """
         | 
| 2 | 
            +
            TODO:
         | 
| 3 | 
            +
             - order preserving / linked list?
         | 
| 4 | 
            +
             - ItemsView
         | 
| 5 | 
            +
            """
         | 
| 6 | 
            +
            import abc
         | 
| 7 | 
            +
            import dataclasses as dc
         | 
| 8 | 
            +
            import typing as ta
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            from .. import lang
         | 
| 11 | 
            +
            from .mappings import yield_dict_init
         | 
| 12 | 
            +
             | 
| 13 | 
            +
             | 
| 14 | 
            +
            K = ta.TypeVar('K')
         | 
| 15 | 
            +
            V = ta.TypeVar('V')
         | 
| 16 | 
            +
            K2 = ta.TypeVar('K2')
         | 
| 17 | 
            +
            V2 = ta.TypeVar('V2')
         | 
| 18 | 
            +
             | 
| 19 | 
            +
             | 
| 20 | 
            +
            class HashEq(lang.Abstract, ta.Generic[K]):
         | 
| 21 | 
            +
                @abc.abstractmethod
         | 
| 22 | 
            +
                def hash(self, k: K) -> int:
         | 
| 23 | 
            +
                    raise NotImplementedError
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                @abc.abstractmethod
         | 
| 26 | 
            +
                def eq(self, l: K, r: K) -> bool:
         | 
| 27 | 
            +
                    raise NotImplementedError
         | 
| 28 | 
            +
             | 
| 29 | 
            +
             | 
| 30 | 
            +
            @lang.unabstract_class([
         | 
| 31 | 
            +
                ('hash', '_hash'),
         | 
| 32 | 
            +
                ('eq', '_eq'),
         | 
| 33 | 
            +
            ])
         | 
| 34 | 
            +
            @dc.dataclass(frozen=True)
         | 
| 35 | 
            +
            class HashEq_(ta.Generic[K]):  # noqa
         | 
| 36 | 
            +
                hash: ta.Callable[[K], int]
         | 
| 37 | 
            +
                eq: ta.Callable[[K, K], bool]
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def _hash(self, k: K) -> int:
         | 
| 40 | 
            +
                    return self.hash(k)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def _eq(self, l: K, r: K) -> bool:
         | 
| 43 | 
            +
                    return self.eq(l, r)
         | 
| 44 | 
            +
             | 
| 45 | 
            +
             | 
| 46 | 
            +
            class hash_eq(HashEq[K], lang.NotInstantiable, lang.Final):  # noqa
         | 
| 47 | 
            +
                """Workaround for PEP 695 support."""
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def __new__(  # type: ignore[misc]
         | 
| 50 | 
            +
                        cls,
         | 
| 51 | 
            +
                        hash: ta.Callable[[K], int],  # noqa
         | 
| 52 | 
            +
                        eq: ta.Callable[[K, K], bool],
         | 
| 53 | 
            +
                ) -> HashEq[K]:
         | 
| 54 | 
            +
                    return HashEq_(hash, eq)  # type: ignore
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def hash(self, k: K) -> int:
         | 
| 57 | 
            +
                    raise TypeError
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                def eq(self, l: K, r: K) -> bool:
         | 
| 60 | 
            +
                    raise TypeError
         | 
| 61 | 
            +
             | 
| 62 | 
            +
             | 
| 63 | 
            +
            class HashEqMap(ta.Mapping[K, V]):
         | 
| 64 | 
            +
                class _Node(ta.NamedTuple, ta.Generic[K2, V2]):
         | 
| 65 | 
            +
                    k: K2
         | 
| 66 | 
            +
                    v: V2
         | 
| 67 | 
            +
                    h: int
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def __init__(self, hash_eq: HashEq[K], *args: ta.Any, **kwargs: ta.Any) -> None:
         | 
| 70 | 
            +
                    super().__init__()
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    self._hash_eq = hash_eq
         | 
| 73 | 
            +
                    self._dct: dict[int, list[HashEqMap._Node[K, V]]] = {}
         | 
| 74 | 
            +
                    self._len = 0
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    for k, v in yield_dict_init(*args, **kwargs):
         | 
| 77 | 
            +
                        self[k] = v
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                def __len__(self) -> int:
         | 
| 80 | 
            +
                    return self._len
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                def __contains__(self, k: K) -> bool:  # type: ignore[override]
         | 
| 83 | 
            +
                    h = self._hash_eq.hash(k)
         | 
| 84 | 
            +
                    try:
         | 
| 85 | 
            +
                        l = self._dct[h]
         | 
| 86 | 
            +
                    except KeyError:
         | 
| 87 | 
            +
                        return False
         | 
| 88 | 
            +
                    return any(self._hash_eq.eq(k, e.k) for e in l)
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                def __getitem__(self, k: K) -> V:
         | 
| 91 | 
            +
                    h = self._hash_eq.hash(k)
         | 
| 92 | 
            +
                    l = self._dct[h]
         | 
| 93 | 
            +
                    for e in l:
         | 
| 94 | 
            +
                        if self._hash_eq.eq(k, e.k):
         | 
| 95 | 
            +
                            return e.v
         | 
| 96 | 
            +
                    raise KeyError(k)
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                def __setitem__(self, k: K, v: V) -> None:
         | 
| 99 | 
            +
                    h = self._hash_eq.hash(k)
         | 
| 100 | 
            +
                    n = HashEqMap._Node(k, v, h)
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                    try:
         | 
| 103 | 
            +
                        l = self._dct[h]
         | 
| 104 | 
            +
                    except KeyError:
         | 
| 105 | 
            +
                        l = [n]
         | 
| 106 | 
            +
                        self._dct[h] = l
         | 
| 107 | 
            +
                        self._len += 1
         | 
| 108 | 
            +
                        return
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                    for i, e in enumerate(l):
         | 
| 111 | 
            +
                        if self._hash_eq.eq(k, e.k):
         | 
| 112 | 
            +
                            l[i] = n
         | 
| 113 | 
            +
                            return
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                    l.append(n)
         | 
| 116 | 
            +
                    self._len += 1
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                def __delitem__(self, k: K) -> None:
         | 
| 119 | 
            +
                    h = self._hash_eq.hash(k)
         | 
| 120 | 
            +
                    l = self._dct[h]
         | 
| 121 | 
            +
                    for i, e in enumerate(l):
         | 
| 122 | 
            +
                        if self._hash_eq.eq(k, e.k):
         | 
| 123 | 
            +
                            del l[i]
         | 
| 124 | 
            +
                            self._len -= 1
         | 
| 125 | 
            +
                            return
         | 
| 126 | 
            +
                    raise KeyError(k)
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                def __iter__(self) -> ta.Iterator[K]:
         | 
| 129 | 
            +
                    return self.iterkeys()
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                def iterkeys(self) -> ta.Iterator[K]:
         | 
| 132 | 
            +
                    for l in self._dct.values():
         | 
| 133 | 
            +
                        for e in l:
         | 
| 134 | 
            +
                            yield e.k
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                def itervalues(self) -> ta.Iterator[V]:
         | 
| 137 | 
            +
                    for l in self._dct.values():
         | 
| 138 | 
            +
                        for e in l:
         | 
| 139 | 
            +
                            yield e.v
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                def iteritems(self) -> ta.Iterator[tuple[K, V]]:
         | 
| 142 | 
            +
                    for l in self._dct.values():
         | 
| 143 | 
            +
                        for e in l:
         | 
| 144 | 
            +
                            yield (e.k, e.v)
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                # FIXME:
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                def keys(self) -> ta.Iterable[K]:  # type: ignore[override]
         | 
| 149 | 
            +
                    return lang.itergen(self.iterkeys)
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                def values(self) -> ta.Iterable[V]:  # type: ignore[override]
         | 
| 152 | 
            +
                    return lang.itergen(self.itervalues)
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                def items(self) -> ta.Iterable[tuple[K, V]]:  # type: ignore[override]
         | 
| 155 | 
            +
                    return lang.itergen(self.iteritems)
         | 
    
        omlish/fnpairs.py
    CHANGED
    
    | @@ -38,7 +38,7 @@ if ta.TYPE_CHECKING: | |
| 38 38 | 
             
                import lz4.frame as _lz4_frame
         | 
| 39 39 | 
             
                import snappy as _snappy
         | 
| 40 40 | 
             
                import yaml as _yaml
         | 
| 41 | 
            -
                import  | 
| 41 | 
            +
                import zstandard as _zstandard
         | 
| 42 42 |  | 
| 43 43 | 
             
            else:
         | 
| 44 44 | 
             
                _bz2 = lang.proxy_import('bz2')
         | 
| @@ -55,7 +55,7 @@ else: | |
| 55 55 | 
             
                _lz4_frame = lang.proxy_import('lz4.frame')
         | 
| 56 56 | 
             
                _snappy = lang.proxy_import('snappy')
         | 
| 57 57 | 
             
                _yaml = lang.proxy_import('yaml')
         | 
| 58 | 
            -
                 | 
| 58 | 
            +
                _zstandard = lang.proxy_import('zstandard')
         | 
| 59 59 |  | 
| 60 60 |  | 
| 61 61 | 
             
            ##
         | 
| @@ -92,6 +92,10 @@ class FnPair(ta.Generic[F, T], abc.ABC): | |
| 92 92 | 
             
            ##
         | 
| 93 93 |  | 
| 94 94 |  | 
| 95 | 
            +
            @lang.unabstract_class([
         | 
| 96 | 
            +
                ('forward', '_forward'),
         | 
| 97 | 
            +
                ('backward', 'backward'),
         | 
| 98 | 
            +
            ])
         | 
| 95 99 | 
             
            @dc.dataclass(frozen=True)
         | 
| 96 100 | 
             
            class Simple(FnPair[F, T]):
         | 
| 97 101 | 
             
                forward: ta.Callable[[F], T]  # type: ignore
         | 
| @@ -104,12 +108,6 @@ class Simple(FnPair[F, T]): | |
| 104 108 | 
             
                    return self.backward(t)
         | 
| 105 109 |  | 
| 106 110 |  | 
| 107 | 
            -
            # HACK: ABC workaround. Our dataclasses handle this with `override=True` but we don't want to dep that in here.
         | 
| 108 | 
            -
            Simple.forward = Simple._forward  # type: ignore  # noqa
         | 
| 109 | 
            -
            Simple.backward = Simple._backward  # type: ignore  # noqa
         | 
| 110 | 
            -
            Simple.__abstractmethods__ = frozenset()  # noqa
         | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 111 | 
             
            of = Simple
         | 
| 114 112 |  | 
| 115 113 | 
             
            NOP: FnPair[ta.Any, ta.Any] = of(lang.identity, lang.identity)
         | 
| @@ -356,10 +354,10 @@ class Snappy(Compression): | |
| 356 354 | 
             
            @_register_extension('zstd')
         | 
| 357 355 | 
             
            class Zstd(Compression):
         | 
| 358 356 | 
             
                def forward(self, f: bytes) -> bytes:
         | 
| 359 | 
            -
                    return  | 
| 357 | 
            +
                    return _zstandard.compress(f)
         | 
| 360 358 |  | 
| 361 359 | 
             
                def backward(self, t: bytes) -> bytes:
         | 
| 362 | 
            -
                    return  | 
| 360 | 
            +
                    return _zstandard.decompress(t)
         | 
| 363 361 |  | 
| 364 362 |  | 
| 365 363 | 
             
            ##
         | 
    
        omlish/lang/__init__.py
    CHANGED
    
    
    
        omlish/lang/classes/__init__.py
    CHANGED
    
    
    
        omlish/lang/classes/abstract.py
    CHANGED
    
    | @@ -72,3 +72,16 @@ def is_abstract_class(obj: ta.Any) -> bool: | |
| 72 72 |  | 
| 73 73 | 
             
            def is_abstract(obj: ta.Any) -> bool:
         | 
| 74 74 | 
             
                return is_abstract_method(obj) or is_abstract_class(obj)
         | 
| 75 | 
            +
             | 
| 76 | 
            +
             | 
| 77 | 
            +
            def unabstract_class(
         | 
| 78 | 
            +
                    impls: ta.Iterable[tuple[str, ta.Any]],
         | 
| 79 | 
            +
            ) -> ta.Callable[[type[T]], type[T]]:
         | 
| 80 | 
            +
                def inner(cls):
         | 
| 81 | 
            +
                    for name, impl in impls:
         | 
| 82 | 
            +
                        if isinstance(impl, str):
         | 
| 83 | 
            +
                            impl = getattr(cls, impl)
         | 
| 84 | 
            +
                        setattr(cls, name, impl)
         | 
| 85 | 
            +
                    setattr(cls, '__abstractmethods__', frozenset())
         | 
| 86 | 
            +
                    return cls
         | 
| 87 | 
            +
                return inner
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            Metadata-Version: 2.1
         | 
| 2 2 | 
             
            Name: omlish
         | 
| 3 | 
            -
            Version: 0.0.0. | 
| 3 | 
            +
            Version: 0.0.0.dev99
         | 
| 4 4 | 
             
            Summary: omlish
         | 
| 5 5 | 
             
            Author: wrmsr
         | 
| 6 6 | 
             
            License: BSD-3-Clause
         | 
| @@ -20,7 +20,7 @@ Requires-Dist: trio ~=0.27 ; extra == 'all' | |
| 20 20 | 
             
            Requires-Dist: trio-asyncio ~=0.15 ; extra == 'all'
         | 
| 21 21 | 
             
            Requires-Dist: lz4 ~=4.3 ; extra == 'all'
         | 
| 22 22 | 
             
            Requires-Dist: python-snappy ~=0.7 ; extra == 'all'
         | 
| 23 | 
            -
            Requires-Dist:  | 
| 23 | 
            +
            Requires-Dist: zstandard ~=0.23 ; extra == 'all'
         | 
| 24 24 | 
             
            Requires-Dist: asttokens ~=2.4 ; extra == 'all'
         | 
| 25 25 | 
             
            Requires-Dist: executing ~=2.1 ; extra == 'all'
         | 
| 26 26 | 
             
            Requires-Dist: psutil ~=6.0 ; extra == 'all'
         | 
| @@ -29,7 +29,7 @@ Requires-Dist: ujson ~=5.10 ; extra == 'all' | |
| 29 29 | 
             
            Requires-Dist: json5 ~=0.9 ; extra == 'all'
         | 
| 30 30 | 
             
            Requires-Dist: pyyaml ~=6.0 ; extra == 'all'
         | 
| 31 31 | 
             
            Requires-Dist: cbor2 ~=5.6 ; extra == 'all'
         | 
| 32 | 
            -
            Requires-Dist: cloudpickle ~=3. | 
| 32 | 
            +
            Requires-Dist: cloudpickle ~=3.1 ; extra == 'all'
         | 
| 33 33 | 
             
            Requires-Dist: httpx[http2] ~=0.27 ; extra == 'all'
         | 
| 34 34 | 
             
            Requires-Dist: wrapt ~=1.14 ; extra == 'all'
         | 
| 35 35 | 
             
            Requires-Dist: cryptography ~=43.0 ; extra == 'all'
         | 
| @@ -52,7 +52,7 @@ Requires-Dist: trio-asyncio ~=0.15 ; extra == 'async' | |
| 52 52 | 
             
            Provides-Extra: compress
         | 
| 53 53 | 
             
            Requires-Dist: lz4 ~=4.3 ; extra == 'compress'
         | 
| 54 54 | 
             
            Requires-Dist: python-snappy ~=0.7 ; extra == 'compress'
         | 
| 55 | 
            -
            Requires-Dist:  | 
| 55 | 
            +
            Requires-Dist: zstandard ~=0.23 ; extra == 'compress'
         | 
| 56 56 | 
             
            Provides-Extra: diag
         | 
| 57 57 | 
             
            Requires-Dist: asttokens ~=2.4 ; extra == 'diag'
         | 
| 58 58 | 
             
            Requires-Dist: executing ~=2.1 ; extra == 'diag'
         | 
| @@ -63,7 +63,7 @@ Requires-Dist: ujson ~=5.10 ; extra == 'formats' | |
| 63 63 | 
             
            Requires-Dist: json5 ~=0.9 ; extra == 'formats'
         | 
| 64 64 | 
             
            Requires-Dist: pyyaml ~=6.0 ; extra == 'formats'
         | 
| 65 65 | 
             
            Requires-Dist: cbor2 ~=5.6 ; extra == 'formats'
         | 
| 66 | 
            -
            Requires-Dist: cloudpickle ~=3. | 
| 66 | 
            +
            Requires-Dist: cloudpickle ~=3.1 ; extra == 'formats'
         | 
| 67 67 | 
             
            Provides-Extra: http
         | 
| 68 68 | 
             
            Requires-Dist: httpx[http2] ~=0.27 ; extra == 'http'
         | 
| 69 69 | 
             
            Provides-Extra: misc
         | 
| @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            omlish/.manifests.json,sha256=hTFp9tvE72BxKloIq1s1SS0LRQlIsvMtO69Sbc47rKg,1704
         | 
| 2 | 
            -
            omlish/__about__.py,sha256= | 
| 2 | 
            +
            omlish/__about__.py,sha256=6713nqxxPtA38L0r9uYNrMgouxInTcm_aUGG-SmXVbI,3351
         | 
| 3 3 | 
             
            omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 4 4 | 
             
            omlish/argparse.py,sha256=Dc73G8lyoQBLvXhMYUbzQUh4SJu_OTvKUXjSUxq_ang,7499
         | 
| 5 5 | 
             
            omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
         | 
| 6 | 
            -
            omlish/cached.py,sha256= | 
| 6 | 
            +
            omlish/cached.py,sha256=vn3ZiKy0d3NW_kzoXCi_Fg_s5vUcH0LQ1idfKBcQhzk,489
         | 
| 7 7 | 
             
            omlish/check.py,sha256=rZFEn6IHiMq4KGCYxlUGcUCJP12pPPUs_-AG0aouPM8,10540
         | 
| 8 8 | 
             
            omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
         | 
| 9 9 | 
             
            omlish/defs.py,sha256=T3bq_7h_tO3nDB5RAFBn7DkdeQgqheXzkFColbOHZko,4890
         | 
| 10 10 | 
             
            omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
         | 
| 11 | 
            -
            omlish/fnpairs.py,sha256= | 
| 11 | 
            +
            omlish/fnpairs.py,sha256=vCuZqLz2IAM3PDaJQE3r1A4EjyrCyUNoCOjoa_SmKCU,10723
         | 
| 12 12 | 
             
            omlish/fnpipes.py,sha256=AJkgz9nvRRm7oqw7ZgYyz21klu276LWi54oYCLg-vOg,2196
         | 
| 13 13 | 
             
            omlish/genmachine.py,sha256=RlU-y_dt2nRdvoo7Z3HsUELlBn3KuyI4qUnqLVbChRI,2450
         | 
| 14 14 | 
             
            omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
         | 
| @@ -94,12 +94,13 @@ omlish/bootstrap/harness.py,sha256=VW8YP-yENGyXIuJ8GL_xintArF13nafwpz-iAghPt34,1 | |
| 94 94 | 
             
            omlish/bootstrap/main.py,sha256=yZhOHDDlj4xB5a89dRdT8z58FsqqnpoBg1-tvY2CJe4,5903
         | 
| 95 95 | 
             
            omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
         | 
| 96 96 | 
             
            omlish/bootstrap/sys.py,sha256=iLHUNIuIPv-k-Mc6aHj5sSET78olCVt7t0HquFDO4iQ,8762
         | 
| 97 | 
            -
            omlish/collections/__init__.py,sha256= | 
| 97 | 
            +
            omlish/collections/__init__.py,sha256=JFphLT_jEe-h_YBKyjrI0RT4KgNvjPXRErebBHwIHfY,1763
         | 
| 98 98 | 
             
            omlish/collections/_abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
         | 
| 99 99 | 
             
            omlish/collections/_io_abc.py,sha256=Cxs8KB1B_69rxpUYxI-MTsilAmNooJJn3w07DKqYKkE,1255
         | 
| 100 100 | 
             
            omlish/collections/coerce.py,sha256=o11AMrUiyoadd8WkdqeKPIpXf2xd0LyylzNCyJivCLU,7036
         | 
| 101 101 | 
             
            omlish/collections/exceptions.py,sha256=shcS-NCnEUudF8qC_SmO2TQyjivKlS4TDjaz_faqQ0c,44
         | 
| 102 102 | 
             
            omlish/collections/frozen.py,sha256=DGxemj_pVID85tSBm-Wns_x4ov0wOEIT6X5bVgJtmkA,4152
         | 
| 103 | 
            +
            omlish/collections/hasheq.py,sha256=UXgZQycBTgPLtwt4onBlNzmjy1zuAw32xuUvOwpwM6g,3813
         | 
| 103 104 | 
             
            omlish/collections/identity.py,sha256=jhEpC8tnfh3Sg-MJff1Fp9eMydt150wits_UeVdctUk,2723
         | 
| 104 105 | 
             
            omlish/collections/indexed.py,sha256=tFQsIWH4k9QqsF5VB7DsIVNsRThiQNx-ooRF36X_PnU,2203
         | 
| 105 106 | 
             
            omlish/collections/mappings.py,sha256=eEifLZez-BWunTuj6974bGxBFfNRODZpu6Oa7_2ME94,3190
         | 
| @@ -256,7 +257,7 @@ omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCF | |
| 256 257 | 
             
            omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
         | 
| 257 258 | 
             
            omlish/inject/impl/proxy.py,sha256=1ko0VaKqzu9UG8bIldp9xtUrAVUOFTKWKTjOCqIGr4s,1636
         | 
| 258 259 | 
             
            omlish/inject/impl/scopes.py,sha256=ASfULXgP_ETlsAqFJfrZmyEaZt64Zr8tNn5ScA-EoXk,5900
         | 
| 259 | 
            -
            omlish/lang/__init__.py,sha256= | 
| 260 | 
            +
            omlish/lang/__init__.py,sha256=pKAxhQe2qbN9pDXPOz9_MRxTKJPPWHZyAkWoAaZ9P4M,3688
         | 
| 260 261 | 
             
            omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
         | 
| 261 262 | 
             
            omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
         | 
| 262 263 | 
             
            omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
         | 
| @@ -275,8 +276,8 @@ omlish/lang/strings.py,sha256=BsciSYnckD4vGtC6kmtnugR9IN6CIHdcjO4nZu-pSAw,3898 | |
| 275 276 | 
             
            omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
         | 
| 276 277 | 
             
            omlish/lang/timeouts.py,sha256=vECdWYhc_IZgcal1Ng1Y42wf2FV3KAx-i8As-MgGHIQ,1186
         | 
| 277 278 | 
             
            omlish/lang/typing.py,sha256=lJ2NGe4Pmb61I0Tx4A_rOqXNFTws1XHOzafg2knRUio,4155
         | 
| 278 | 
            -
            omlish/lang/classes/__init__.py,sha256= | 
| 279 | 
            -
            omlish/lang/classes/abstract.py,sha256= | 
| 279 | 
            +
            omlish/lang/classes/__init__.py,sha256=D3dn4FOQu5f50kW4_jLCI_zI0fTtADdYumirRdIqSuU,605
         | 
| 280 | 
            +
            omlish/lang/classes/abstract.py,sha256=oleeYCMVbmFAy8aNLNKeb18Jmmgzfolymdw31m4tejQ,2679
         | 
| 280 281 | 
             
            omlish/lang/classes/restrict.py,sha256=pSK7ZT_kpwqS6lWRrxwuEe-tt07F0-uZVazgGh-HDco,3921
         | 
| 281 282 | 
             
            omlish/lang/classes/simple.py,sha256=XQ8b86WvQA0qtSYqlbMOJS7tHgE8sv9onda33uQmbkM,3294
         | 
| 282 283 | 
             
            omlish/lang/classes/virtual.py,sha256=W-QJuKsDehOcrydwg6eMN0bFPTYbk3Tz84TSH3blb44,3367
         | 
| @@ -457,9 +458,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928 | |
| 457 458 | 
             
            omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
         | 
| 458 459 | 
             
            omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
         | 
| 459 460 | 
             
            omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
         | 
| 460 | 
            -
            omlish-0.0.0. | 
| 461 | 
            -
            omlish-0.0.0. | 
| 462 | 
            -
            omlish-0.0.0. | 
| 463 | 
            -
            omlish-0.0.0. | 
| 464 | 
            -
            omlish-0.0.0. | 
| 465 | 
            -
            omlish-0.0.0. | 
| 461 | 
            +
            omlish-0.0.0.dev99.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
         | 
| 462 | 
            +
            omlish-0.0.0.dev99.dist-info/METADATA,sha256=dlvMKXrg8JClykUv0QJZisR5FWrEFVDWqr5W07gAKP0,3999
         | 
| 463 | 
            +
            omlish-0.0.0.dev99.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
         | 
| 464 | 
            +
            omlish-0.0.0.dev99.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
         | 
| 465 | 
            +
            omlish-0.0.0.dev99.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
         | 
| 466 | 
            +
            omlish-0.0.0.dev99.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |