omlish 0.0.0.dev28__py3-none-any.whl → 0.0.0.dev29__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 CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev28'
2
- __revision__ = '8adf3c1230237633abb8801258638f0ae2fa4099'
1
+ __version__ = '0.0.0.dev29'
2
+ __revision__ = 'cde08614ca06e103fcae31adbb677c772002aef1'
3
3
 
4
4
 
5
5
  #
@@ -30,7 +30,7 @@ class Project(ProjectBase):
30
30
 
31
31
  optional_dependencies = {
32
32
  'async': [
33
- 'anyio ~= 4.4',
33
+ 'anyio ~= 4.5',
34
34
  'sniffio ~= 1.3',
35
35
 
36
36
  'greenlet ~= 3.1',
@@ -70,8 +70,6 @@ class Project(ProjectBase):
70
70
  ],
71
71
 
72
72
  'misc': [
73
- 'jinja2 ~= 3.1',
74
-
75
73
  'wrapt ~= 1.14',
76
74
  ],
77
75
 
@@ -81,7 +79,9 @@ class Project(ProjectBase):
81
79
 
82
80
  'sql': [
83
81
  'sqlalchemy[asyncio] ~= 2.0',
82
+ ],
84
83
 
84
+ 'sql-drivers': [
85
85
  'pg8000 ~= 1.31',
86
86
  # 'psycopg2 ~= 2.9',
87
87
  # 'psycopg ~= 3.2',
@@ -93,9 +93,7 @@ class Project(ProjectBase):
93
93
  'aiomysql ~= 0.2',
94
94
  'aiosqlite ~= 0.20',
95
95
  'asyncpg ~= 0.29; python_version < "3.13"',
96
- ],
97
96
 
98
- 'sqlx': [
99
97
  'sqlean.py ~= 3.45; python_version < "3.13"',
100
98
 
101
99
  'duckdb ~= 1.1',
@@ -17,7 +17,6 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER I
17
17
  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18
18
  """
19
19
  # ruff: noqa: SLF001
20
-
21
20
  import typing as ta
22
21
 
23
22
 
@@ -178,6 +178,9 @@ def field_init(
178
178
  if fx.derive is not None:
179
179
  raise NotImplementedError
180
180
 
181
+ if fx.frozen:
182
+ raise NotImplementedError
183
+
181
184
  if fx.coerce is not None:
182
185
  cn = f'__dataclass_coerce__{f.name}__'
183
186
  locals[cn] = fx.coerce
omlish/lang/__init__.py CHANGED
@@ -98,6 +98,7 @@ from .functions import ( # noqa
98
98
  Args,
99
99
  VoidError,
100
100
  as_async,
101
+ coalesce,
101
102
  constant,
102
103
  finally_,
103
104
  identity,
@@ -107,6 +108,7 @@ from .functions import ( # noqa
107
108
  isinstance_of,
108
109
  issubclass_of,
109
110
  maybe_call,
111
+ opt_coalesce,
110
112
  periodically,
111
113
  raise_,
112
114
  raising,
omlish/lang/functions.py CHANGED
@@ -183,3 +183,20 @@ class Args:
183
183
 
184
184
  def __call__(self, fn: ta.Callable[..., T]) -> T:
185
185
  return fn(*self.args, **self.kwargs)
186
+
187
+
188
+ ##
189
+
190
+
191
+ def coalesce(*vs: T | None) -> T:
192
+ for v in vs:
193
+ if v is not None:
194
+ return v
195
+ raise ValueError('No value given')
196
+
197
+
198
+ def opt_coalesce(*vs: T | None) -> T | None:
199
+ for v in vs:
200
+ if v is not None:
201
+ return v
202
+ return None
omlish/lite/secrets.py CHANGED
@@ -20,3 +20,17 @@ class Secret:
20
20
 
21
21
  def reveal(self) -> str:
22
22
  return getattr(self, self._VALUE_ATTR)()
23
+
24
+ #
25
+
26
+ def __reduce__(self) -> ta.NoReturn:
27
+ raise TypeError
28
+
29
+ def __reduce_ex__(self, protocol) -> ta.NoReturn:
30
+ raise TypeError
31
+
32
+ def __getstate__(self) -> ta.NoReturn:
33
+ raise TypeError
34
+
35
+ def __setstate__(self, state) -> ta.NoReturn:
36
+ raise TypeError
File without changes
@@ -1,15 +1,10 @@
1
1
  import functools
2
- import struct
3
2
  import typing as ta
4
3
 
5
4
 
6
5
  ##
7
6
 
8
7
 
9
- def isclose(a: float, b: float, *, rel_tol: float = 1e-09, abs_tol: float = 0.0) -> float:
10
- return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
11
-
12
-
13
8
  def get_bit(bit: int, value: int) -> int:
14
9
  return (value >> bit) & 1
15
10
 
@@ -29,14 +24,6 @@ def set_bits(bits_from: int, num_bits: int, bits_value: int, value: int) -> int:
29
24
  return value & ~(((1 << num_bits) - 1) << bits_from) | (bits_value << bits_from)
30
25
 
31
26
 
32
- def float_to_bytes(f: float) -> bytes:
33
- return struct.pack('>f', f)
34
-
35
-
36
- def bytes_to_float(b: bytes) -> float:
37
- return struct.unpack('>f', b)[0]
38
-
39
-
40
27
  ##
41
28
 
42
29
 
omlish/math/floats.py ADDED
@@ -0,0 +1,13 @@
1
+ import struct
2
+
3
+
4
+ def isclose(a: float, b: float, *, rel_tol: float = 1e-09, abs_tol: float = 0.0) -> float:
5
+ return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
6
+
7
+
8
+ def float_to_bytes(f: float) -> bytes:
9
+ return struct.pack('>f', f)
10
+
11
+
12
+ def bytes_to_float(b: bytes) -> float:
13
+ return struct.unpack('>f', b)[0]
@@ -3,6 +3,7 @@ TODO:
3
3
  - reservoir
4
4
  - dep tdigest?
5
5
  - struct-of-arrays - array.array('f', ...) - backed SamplingHistogram
6
+ - https://docs.python.org/3/library/statistics.html
6
7
  """
7
8
  import bisect
8
9
  import collections
@@ -14,8 +15,8 @@ import random
14
15
  import time
15
16
  import typing as ta
16
17
 
17
- from . import cached
18
- from . import check
18
+ from .. import cached
19
+ from .. import check
19
20
 
20
21
 
21
22
  ##
omlish/text/asdl.py CHANGED
@@ -217,7 +217,7 @@ class TokenKind(enum.IntEnum):
217
217
  COMMA = enum.auto()
218
218
  QUESTION = enum.auto()
219
219
  PIPE = enum.auto()
220
- AstERISK = enum.auto()
220
+ ASTERISK = enum.auto()
221
221
  L_PAREN = enum.auto()
222
222
  R_PAREN = enum.auto()
223
223
  L_BRACE = enum.auto()
@@ -231,7 +231,7 @@ OPERATOR_TABLE: ta.Mapping[str, TokenKind] = {
231
231
  '|': TokenKind.PIPE,
232
232
  '(': TokenKind.L_PAREN,
233
233
  ')': TokenKind.R_PAREN,
234
- '*': TokenKind.AstERISK,
234
+ '*': TokenKind.ASTERISK,
235
235
  '{': TokenKind.L_BRACE,
236
236
  '}': TokenKind.R_BRACE,
237
237
  }
@@ -373,7 +373,7 @@ class AsdlParser:
373
373
 
374
374
  def _parse_optional_field_quantifier(self) -> tuple[bool, bool]: # (seq, opt)
375
375
  is_seq, is_opt = False, False
376
- if self.cur().kind == TokenKind.AstERISK:
376
+ if self.cur().kind == TokenKind.ASTERISK:
377
377
  is_seq = True
378
378
  self._advance()
379
379
  elif self.cur().kind == TokenKind.QUESTION:
@@ -394,7 +394,8 @@ class AsdlParser:
394
394
  _id_kinds = (TokenKind.CONSTRUCTOR_ID, TokenKind.TYPE_ID)
395
395
 
396
396
  def _match(self, kind: TokenKind | tuple[TokenKind, ...]) -> str:
397
- """The 'match' primitive of RD parsers.
397
+ """
398
+ The 'match' primitive of RD parsers.
398
399
 
399
400
  * Verifies that the current token is of the given kind (kind can be a tuple, in which the kind must match one of
400
401
  its members).
omlish/text/parts.py CHANGED
@@ -30,7 +30,7 @@ def _check_part(o: PartT) -> PartT:
30
30
  return o
31
31
 
32
32
 
33
- def _check_optional_part(o: PartT | None) -> PartT | None:
33
+ def _check_opt_part(o: PartT | None) -> PartT | None:
34
34
  if o is None:
35
35
  return None
36
36
  return _check_part(o)
@@ -49,7 +49,7 @@ class Wrap(DataPart, lang.Final):
49
49
 
50
50
 
51
51
  class List(DataPart, lang.Final):
52
- parts: ta.Sequence[Part | None] = dc.xfield(coerce=col.seq_of(_check_optional_part))
52
+ parts: ta.Sequence[Part | None] = dc.xfield(coerce=col.seq_of(_check_opt_part))
53
53
  delimiter: str = dc.field(default=',') # FIXME: , check_type=str)
54
54
  trailer: bool = dc.field(default=False) # FIXME: , check_type=bool)
55
55
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev28
3
+ Version: 0.0.0.dev29
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -13,7 +13,7 @@ Classifier: Operating System :: POSIX
13
13
  Requires-Python: ~=3.12
14
14
  License-File: LICENSE
15
15
  Provides-Extra: all
16
- Requires-Dist: anyio ~=4.4 ; extra == 'all'
16
+ Requires-Dist: anyio ~=4.5 ; extra == 'all'
17
17
  Requires-Dist: sniffio ~=1.3 ; extra == 'all'
18
18
  Requires-Dist: greenlet ~=3.1 ; extra == 'all'
19
19
  Requires-Dist: trio ~=0.26 ; extra == 'all'
@@ -29,7 +29,6 @@ Requires-Dist: json5 ~=0.9 ; extra == 'all'
29
29
  Requires-Dist: pyyaml ~=5.0 ; extra == 'all'
30
30
  Requires-Dist: cloudpickle ~=3.0 ; extra == 'all'
31
31
  Requires-Dist: httpx[http2] ~=0.27 ; extra == 'all'
32
- Requires-Dist: jinja2 ~=3.1 ; extra == 'all'
33
32
  Requires-Dist: wrapt ~=1.14 ; extra == 'all'
34
33
  Requires-Dist: cryptography ~=43.0 ; extra == 'all'
35
34
  Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; extra == 'all'
@@ -43,7 +42,7 @@ Requires-Dist: python-snappy ~=0.7 ; (python_version < "3.13") and extra == 'all
43
42
  Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'all'
44
43
  Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'all'
45
44
  Provides-Extra: async
46
- Requires-Dist: anyio ~=4.4 ; extra == 'async'
45
+ Requires-Dist: anyio ~=4.5 ; extra == 'async'
47
46
  Requires-Dist: sniffio ~=1.3 ; extra == 'async'
48
47
  Requires-Dist: greenlet ~=3.1 ; extra == 'async'
49
48
  Requires-Dist: trio ~=0.26 ; extra == 'async'
@@ -65,20 +64,19 @@ Requires-Dist: cloudpickle ~=3.0 ; extra == 'formats'
65
64
  Provides-Extra: http
66
65
  Requires-Dist: httpx[http2] ~=0.27 ; extra == 'http'
67
66
  Provides-Extra: misc
68
- Requires-Dist: jinja2 ~=3.1 ; extra == 'misc'
69
67
  Requires-Dist: wrapt ~=1.14 ; extra == 'misc'
70
68
  Provides-Extra: secrets
71
69
  Requires-Dist: cryptography ~=43.0 ; extra == 'secrets'
72
70
  Provides-Extra: sql
73
71
  Requires-Dist: sqlalchemy[asyncio] ~=2.0 ; extra == 'sql'
74
- Requires-Dist: pg8000 ~=1.31 ; extra == 'sql'
75
- Requires-Dist: pymysql ~=1.1 ; extra == 'sql'
76
- Requires-Dist: aiomysql ~=0.2 ; extra == 'sql'
77
- Requires-Dist: aiosqlite ~=0.20 ; extra == 'sql'
78
- Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'sql'
79
- Provides-Extra: sqlx
80
- Requires-Dist: duckdb ~=1.1 ; extra == 'sqlx'
81
- Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sqlx'
72
+ Provides-Extra: sql-drivers
73
+ Requires-Dist: pg8000 ~=1.31 ; extra == 'sql-drivers'
74
+ Requires-Dist: pymysql ~=1.1 ; extra == 'sql-drivers'
75
+ Requires-Dist: aiomysql ~=0.2 ; extra == 'sql-drivers'
76
+ Requires-Dist: aiosqlite ~=0.20 ; extra == 'sql-drivers'
77
+ Requires-Dist: duckdb ~=1.1 ; extra == 'sql-drivers'
78
+ Requires-Dist: asyncpg ~=0.29 ; (python_version < "3.13") and extra == 'sql-drivers'
79
+ Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sql-drivers'
82
80
  Provides-Extra: testing
83
81
  Requires-Dist: pytest ~=8.0 ; extra == 'testing'
84
82
 
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=N1F-Xz3GaBn2H1p7uKzhkhKCQV8QVR0t76XD6wmFtXA,3
2
- omlish/__about__.py,sha256=SF90VIrjkctgajp8SFdNIxh69XQtRt20Y0ZhGvmT-3Q,2721
2
+ omlish/__about__.py,sha256=KzvTeQDmeZtJfbz_X82IPqzh5xJ44YhJRVMI4N3c2Ig,2698
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omlish/argparse.py,sha256=QRQmX9G0-L_nATkFtGHvpd4qrpYzKATdjuFLbBqzJPM,6224
5
5
  omlish/c3.py,sha256=W5EwYx9Por3rWYLkKUitJ6OoRMLLgVTfLTyroOz41Y0,8047
@@ -14,11 +14,9 @@ omlish/genmachine.py,sha256=LCMiqvK32dAWtrlB6lKw9tXdQFiXC8rRdk4TMQYIroU,1603
14
14
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
15
15
  omlish/libc.py,sha256=u0481imCiTFqP_e-v9g0pD-0WD249j5vYzhtn-fnNkY,15308
16
16
  omlish/matchfns.py,sha256=ygqbqthRxgF9I1PJaw9Xl7FoZnAVMmnKBrYgimKQ0ag,6152
17
- omlish/math.py,sha256=AVqp5Y8yxKA-wO0BgrzaxA0Ga3PZiCXnYcwivMneC-0,3804
18
17
  omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
19
18
  omlish/os.py,sha256=cz4nL2ujaxH_-XRq3JUD8af8mSe1JXGPIoXP9XAEd0M,2607
20
19
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
21
- omlish/stats.py,sha256=vJOJgYIW6DGDEgNm5AGWIp08GiLk61Cjld71fnC29fY,9998
22
20
  omlish/sync.py,sha256=AqwIfIuCMVHLwlJUa7dmaSjfA4sM5AYPCD5-nsz3XVQ,1516
23
21
  omlish/term.py,sha256=NEmxqAhicyInGtmFamZAizI2xdu819MzFYPEp0Fx97M,6111
24
22
  omlish/asyncs/__init__.py,sha256=uUz9ziKh4_QrgmdhKFMgq6j7mFbiZd3LiogguDCQsGI,587
@@ -50,7 +48,7 @@ omlish/collections/ordered.py,sha256=RzEC3fHvrDeJQSWThVDNYQKke263Vje1II5YwtDwT1Q
50
48
  omlish/collections/persistent.py,sha256=KG471s0bhhReQrjlmX0xaN9HeAIcrtT264ddZCxsExo,875
51
49
  omlish/collections/skiplist.py,sha256=xjuKZtSScp1VnOi9lpf7I090vGp1DnjA5ELjFhMeGps,5987
52
50
  omlish/collections/sorted.py,sha256=E5ZOdNn7Jju1EcQ7CX2Ltk9StIXsBOzqvh7EsT3ZA2U,3354
53
- omlish/collections/treap.py,sha256=wq9L5hvxq4QgPvIpHmueZMF8t7UrvX5vmlNN4BOqY4g,7720
51
+ omlish/collections/treap.py,sha256=A09ZPacGyJlyRB-Wi4TNj3tE0w-RpFNliPgpDaa6Vwg,7719
54
52
  omlish/collections/treapmap.py,sha256=TxOM-ZRF5PK2xe5wRIhESNt7DGh9b_MeZfE7HLkCOs4,5804
55
53
  omlish/collections/unmodifiable.py,sha256=QmUEi9IBXqiM_KGgH2rqg15VmkHJo1MZ6kwq2twEMho,4750
56
54
  omlish/collections/utils.py,sha256=9o9STwzAn5YjZRZ9ns1kuo7NgLXLaoVPFu6AJd-3JT8,4336
@@ -75,7 +73,7 @@ omlish/dataclasses/impl/as_.py,sha256=CD-t7hkC1EP2F_jvZKIA_cVoDuwZ-Ln_xC4fJumPYX
75
73
  omlish/dataclasses/impl/copy.py,sha256=Tn8_n6Vohs-w4otbGdubBEvhd3TsSTaM3EfNGdS2LYo,591
76
74
  omlish/dataclasses/impl/descriptors.py,sha256=rEYE1Len99agTQCC25hSPMnM19BgPr0ZChABGi58Fdk,2476
77
75
  omlish/dataclasses/impl/exceptions.py,sha256=DeiM6rcjgncudn-XVuph9TDbVDEwBtyYb1bcbO3FFcA,193
78
- omlish/dataclasses/impl/fields.py,sha256=yh2mwXVZW-eOhPesY-BG9sVMWSdn0VqzXNHkbs4Jmok,5987
76
+ omlish/dataclasses/impl/fields.py,sha256=DrFPLlPeJ4dCbbRsuwfx-y47Fx3iSllJP0YM5eq6nIE,6040
79
77
  omlish/dataclasses/impl/frozen.py,sha256=x87DSM8FIMZ3c_BIUE8NooCkExFjPsabeqIueEP5qKs,2988
80
78
  omlish/dataclasses/impl/hashing.py,sha256=FKnHuXCg9ylrzK2TLGqO5yfRN4HX3F415CSLlVYXtYE,3190
81
79
  omlish/dataclasses/impl/init.py,sha256=IgxO9nwHaHF8jGrUAk-Y5xke9uV2OwzfEe-88McE1Wg,6161
@@ -164,7 +162,7 @@ omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCF
164
162
  omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
165
163
  omlish/inject/impl/proxy.py,sha256=1ko0VaKqzu9UG8bIldp9xtUrAVUOFTKWKTjOCqIGr4s,1636
166
164
  omlish/inject/impl/scopes.py,sha256=ASfULXgP_ETlsAqFJfrZmyEaZt64Zr8tNn5ScA-EoXk,5900
167
- omlish/lang/__init__.py,sha256=WF4vYG4awiOAXezL4gwCjzYu4JpzqU57U-w3c6rzoLw,3500
165
+ omlish/lang/__init__.py,sha256=7GgNUH1ez1N68rkTN1-zKDaVOoDHW-BZ9V_H2LIFfqM,3532
168
166
  omlish/lang/cached.py,sha256=LwsgWQjQ5op618rBvI8vbASOEGWDTt_SKq6Tc1vlgZM,7680
169
167
  omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
170
168
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
@@ -172,7 +170,7 @@ omlish/lang/contextmanagers.py,sha256=rzMSwJU7ObFXl46r6pGDbD45Zi_qZ9NHxDPnLNuux9
172
170
  omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
173
171
  omlish/lang/descriptors.py,sha256=OLM1qi14kY7PLGIJnvkd6CBEOzHgD9q8Cs2cB6Kzflk,6602
174
172
  omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
175
- omlish/lang/functions.py,sha256=yJxWwqlXEAT2gied4uTwiz5x1qXeuVubOSXyn9zy5aI,3624
173
+ omlish/lang/functions.py,sha256=kkPfcdocg-OmyN7skIqrFxNvqAv89Zc_kXKYAN8vw8g,3895
176
174
  omlish/lang/imports.py,sha256=04ugFC8NI5sbL7NH4V0r0q_nFsP_AMkHLz697CVkMtQ,6274
177
175
  omlish/lang/iterables.py,sha256=_q6rHbdFfW3VBqez0IV3rUABoNxsA_oBv_sykm5zsbQ,2243
178
176
  omlish/lang/maybes.py,sha256=NYHZDjqDtwPMheDrj2VtUVujxRPf8Qpgk4ZlZCTvBZc,3492
@@ -205,7 +203,7 @@ omlish/lite/logs.py,sha256=PeJZUJWd1K-UFErVs0wtD0zRMFW5-olUNFVVZAj_ScY,5549
205
203
  omlish/lite/marshal.py,sha256=u6jYUN_AndvI6__HJBvSw5ElHWC0CfHqgiDS28Vpqjg,8593
206
204
  omlish/lite/reflect.py,sha256=9QYJwdINraq1JNMEgvoqeSlVvRRgOXpxAkpgX8EgRXc,1307
207
205
  omlish/lite/runtime.py,sha256=VUhmNQvwf8QzkWSKj4Q0ReieJA_PzHaJNRBivfTseow,452
208
- omlish/lite/secrets.py,sha256=KZvGG7bFrjzIeLwohxsJ0Ctzpi42C-3A1PEMCIszJJs,521
206
+ omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
209
207
  omlish/lite/strings.py,sha256=9dO_A6EkhcTZ2xmOUGSOMT-mx9BnoOzYu1-ocSrDJaA,670
210
208
  omlish/lite/subprocesses.py,sha256=KuGV3ImehMjCUK0JoV3pUtG_7o5wei1lRDn9HxzByAg,3063
211
209
  omlish/logs/__init__.py,sha256=FbOyAW-lGH8gyBlSVArwljdYAU6RnwZLI5LwAfuNnrk,438
@@ -242,6 +240,10 @@ omlish/marshal/unions.py,sha256=m9uVp2HrkZKY9lDyGoWQGXFgan8mRuBaKimtWNksl64,2635
242
240
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
243
241
  omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
244
242
  omlish/marshal/values.py,sha256=ssHiWdg_L6M17kAn8GiGdPW7UeQOm3RDikWkvwblf5I,263
243
+ omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
244
+ omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
245
+ omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
246
+ omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
245
247
  omlish/reflect/__init__.py,sha256=iWDCNJNP4afPcv-MxZRJSIRQ4NRw6XYPyRHhBXb5YIA,667
246
248
  omlish/reflect/isinstance.py,sha256=x5T9S2634leinBT4hl3CZZkRttvdvvlxChkC_x9Qu2s,1176
247
249
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
@@ -306,13 +308,13 @@ omlish/testing/pytest/plugins/spacing.py,sha256=JQQhi9q3c523Ro1a_K_9RGAb7HotiO74
306
308
  omlish/testing/pytest/plugins/switches.py,sha256=9FtN5qtPBoS-teEp54OHPF6jlZJakRJdq4pnLJpPj_A,3001
307
309
  omlish/testing/pytest/plugins/utils.py,sha256=L5C622UXcA_AUKDcvyh5IMiRfqSGGz0McdhwZWvfMlU,261
308
310
  omlish/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
309
- omlish/text/asdl.py,sha256=9Zbd8az7jum1EqRYuNaKyRFG58WA56G4nLHWc_NBN8g,16856
311
+ omlish/text/asdl.py,sha256=3v5UocAfxan_d9drkGNdH3AMfx_FFBpQu3ULGL4M6VM,16865
310
312
  omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
311
313
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
312
314
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
313
- omlish/text/parts.py,sha256=KGgo0wHOIMVMZtDso-rhSWKAcAkYAH2IGpg9tULabu8,6505
314
- omlish-0.0.0.dev28.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
315
- omlish-0.0.0.dev28.dist-info/METADATA,sha256=kz-tHFHaXXkqK4NutvYQ6Uvxag9ogDnJFyUX0DgBrFo,3666
316
- omlish-0.0.0.dev28.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
317
- omlish-0.0.0.dev28.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
318
- omlish-0.0.0.dev28.dist-info/RECORD,,
315
+ omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
316
+ omlish-0.0.0.dev29.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
317
+ omlish-0.0.0.dev29.dist-info/METADATA,sha256=J9BcC0SJmQjneAgNGyWD756p2EyX8iSvs92bU2JAQH4,3636
318
+ omlish-0.0.0.dev29.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
319
+ omlish-0.0.0.dev29.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
320
+ omlish-0.0.0.dev29.dist-info/RECORD,,