omlish 0.0.0.dev418__py3-none-any.whl → 0.0.0.dev419__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.dev418'
2
- __revision__ = '768aa72e47d914554932c2598e2f832465969997'
1
+ __version__ = '0.0.0.dev419'
2
+ __revision__ = 'ec06deda53ea93f16a7dc690230fe51edce49e7b'
3
3
 
4
4
 
5
5
  #
@@ -94,7 +94,7 @@ class Launcher:
94
94
  if (pid_file := self._pid_file) is not None:
95
95
  if not isinstance(spawner, InProcessSpawner):
96
96
  pidfile = es.enter_context(open_inheritable_pidfile(pid_file))
97
- pidfile_manager = lang.NopContextManager(pidfile)
97
+ pidfile_manager = lang.ValueContextManager(pidfile)
98
98
 
99
99
  else:
100
100
  check.state(not self._reparent_process)
@@ -48,6 +48,7 @@ class Options:
48
48
 
49
49
  ##
50
50
 
51
+ @lang.cached_function
51
52
  def __int__(self) -> int:
52
53
  return (
53
54
  (oj.OPT_APPEND_NEWLINE if self.append_newline else 0) |
@@ -49,8 +49,8 @@ import types
49
49
  import typing as ta
50
50
 
51
51
 
52
- TomlParseFloat = ta.Callable[[str], ta.Any]
53
- TomlKey = ta.Tuple[str, ...]
52
+ TomlParseFloat = ta.Callable[[str], ta.Any] # ta.TypeAlias
53
+ TomlKey = ta.Tuple[str, ...] # ta.TypeAlias
54
54
  TomlPos = int # ta.TypeAlias
55
55
 
56
56
 
omlish/lang/__init__.py CHANGED
@@ -145,22 +145,42 @@ with _auto_proxy_init(
145
145
  )
146
146
 
147
147
  from .contextmanagers import ( # noqa
148
- AsyncContextManager,
149
148
  ContextManaged,
150
- ContextManager,
151
- ContextWrapped,
152
- DefaultLockable,
153
- Lockable,
149
+ SelfContextManaged,
150
+ ValueContextManager,
154
151
  NOP_CONTEXT_MANAGER,
155
- NopContextManager,
156
- Timer,
152
+
153
+ AsyncContextManaged,
154
+ SelfAsyncContextManaged,
155
+ ValueAsyncContextManager,
156
+ NOP_ASYNC_CONTEXT_MANAGER,
157
+
158
+ AsyncContextManager,
159
+
160
+ ContextManager,
161
+
162
+ maybe_managing,
163
+ disposing,
157
164
  breakpoint_on_exception,
158
165
  context_var_setting,
166
+
167
+ as_async_context_manager,
168
+
169
+ ContextWrappable,
170
+ ContextWrapped,
159
171
  context_wrapped,
172
+
173
+ Lockable,
174
+ DefaultLockable,
160
175
  default_lock,
161
- disposing,
176
+
177
+ AsyncLockable,
178
+ DefaultAsyncLockable,
179
+ default_async_lock,
180
+
181
+ Timer,
182
+
162
183
  double_check_setdefault,
163
- maybe_managing,
164
184
  )
165
185
 
166
186
  from .datetimes import ( # noqa
@@ -297,7 +317,7 @@ with _auto_proxy_init(
297
317
  just,
298
318
  )
299
319
 
300
- from .maysyncs import ( # noqa
320
+ from .maysync import ( # noqa
301
321
  make_maysync_fn,
302
322
  make_maysync_generator_fn,
303
323
  make_maysync,
@@ -439,7 +459,7 @@ with _auto_proxy_init(
439
459
  Maybe,
440
460
  )
441
461
 
442
- from ..lite.maysyncs import ( # noqa
462
+ from ..lite.maysync import ( # noqa
443
463
  mark_maysync,
444
464
  is_maysync,
445
465
 
@@ -2,6 +2,7 @@
2
2
  TODO:
3
3
  - AsyncExitStacked
4
4
  - lol does double_check_setdefault need a CowDict in FT?
5
+ - AsyncLockable, DefaultAsyncLockable
5
6
  """
6
7
  import abc
7
8
  import contextlib
@@ -21,16 +22,45 @@ V = ta.TypeVar('V')
21
22
  ##
22
23
 
23
24
 
24
- class _NOT_SET: # noqa
25
- def __new__(cls, *args, **kwargs): # noqa
26
- raise TypeError
25
+ class ContextManaged(abc.ABC): # noqa
26
+ def __enter__(self):
27
+ return None
28
+
29
+ def __exit__(
30
+ self,
31
+ exc_type: type[BaseException] | None,
32
+ exc_val: BaseException | None,
33
+ exc_tb: types.TracebackType | None,
34
+ ) -> bool | None:
35
+ return None
27
36
 
28
37
 
29
- class ContextManaged:
38
+ class SelfContextManaged(ContextManaged):
30
39
  def __enter__(self) -> ta.Self:
31
40
  return self
32
41
 
33
- def __exit__(
42
+
43
+ class ValueContextManager(ContextManaged, ta.Generic[T]):
44
+ def __init__(self, value: T) -> None:
45
+ super().__init__()
46
+
47
+ self._value = value
48
+
49
+ def __enter__(self) -> T:
50
+ return self._value
51
+
52
+
53
+ NOP_CONTEXT_MANAGER = ValueContextManager(None)
54
+
55
+
56
+ #
57
+
58
+
59
+ class AsyncContextManaged(abc.ABC): # noqa
60
+ async def __aenter__(self):
61
+ return None
62
+
63
+ async def __aexit__(
34
64
  self,
35
65
  exc_type: type[BaseException] | None,
36
66
  exc_val: BaseException | None,
@@ -39,23 +69,22 @@ class ContextManaged:
39
69
  return None
40
70
 
41
71
 
42
- class NopContextManager(ContextManaged):
43
- def __init__(self, /, value: ta.Any = _NOT_SET) -> None:
72
+ class SelfAsyncContextManaged(AsyncContextManaged):
73
+ async def __aenter__(self) -> ta.Self:
74
+ return self
75
+
76
+
77
+ class ValueAsyncContextManager(AsyncContextManaged, ta.Generic[T]):
78
+ def __init__(self, value: T) -> None:
44
79
  super().__init__()
45
80
 
46
81
  self._value = value
47
82
 
48
- def __enter__(self):
49
- if (value := self._value) is _NOT_SET:
50
- return self
51
- else:
52
- return value
53
-
54
- def __init_subclass__(cls, **kwargs: ta.Any) -> None:
55
- raise TypeError
83
+ async def __aenter__(self) -> T:
84
+ return self._value
56
85
 
57
86
 
58
- NOP_CONTEXT_MANAGER = NopContextManager()
87
+ NOP_ASYNC_CONTEXT_MANAGER = ValueAsyncContextManager(None)
59
88
 
60
89
 
61
90
  ##
@@ -90,6 +119,9 @@ class ContextManager(abc.ABC, ta.Generic[T]):
90
119
  return self._contextmanager.__exit__(exc_type, exc_val, exc_tb)
91
120
 
92
121
 
122
+ #
123
+
124
+
93
125
  class AsyncContextManager(abc.ABC, ta.Generic[T]):
94
126
  def __init_subclass__(cls, **kwargs: ta.Any) -> None:
95
127
  super().__init_subclass__(**kwargs)
@@ -160,6 +192,15 @@ def context_var_setting(var: contextvars.ContextVar[T], val: T) -> ta.Iterator[T
160
192
  ##
161
193
 
162
194
 
195
+ @contextlib.asynccontextmanager
196
+ async def as_async_context_manager(cm: ta.ContextManager[T]) -> ta.AsyncIterator[T]:
197
+ with cm as v:
198
+ yield v
199
+
200
+
201
+ ##
202
+
203
+
163
204
  ContextWrappable: ta.TypeAlias = ta.ContextManager | str | ta.Callable[..., ta.ContextManager]
164
205
 
165
206
 
@@ -257,6 +298,30 @@ def default_lock(value: DefaultLockable, default: DefaultLockable = None) -> Loc
257
298
  raise TypeError(value)
258
299
 
259
300
 
301
+ #
302
+
303
+
304
+ AsyncLockable = ta.Callable[[], ta.AsyncContextManager]
305
+ DefaultAsyncLockable = AsyncLockable | ta.AsyncContextManager | None
306
+
307
+
308
+ def default_async_lock(value: DefaultAsyncLockable, default: DefaultAsyncLockable = None) -> AsyncLockable:
309
+ if value is None:
310
+ value = default
311
+
312
+ if value is None:
313
+ return lambda: NOP_ASYNC_CONTEXT_MANAGER
314
+
315
+ elif callable(value):
316
+ return value
317
+
318
+ elif isinstance(value, ta.AsyncContextManager):
319
+ return lambda: value
320
+
321
+ else:
322
+ raise TypeError(value)
323
+
324
+
260
325
  ##
261
326
 
262
327
 
@@ -512,8 +512,8 @@ class AutoProxyInit:
512
512
  self,
513
513
  init_globals: ta.MutableMapping[str, ta.Any],
514
514
  *,
515
- disable: bool,
516
- eager: bool,
515
+ disable: bool = False,
516
+ eager: bool = False,
517
517
  ) -> None:
518
518
  super().__init__()
519
519
 
@@ -1,8 +1,8 @@
1
1
  import typing as ta
2
2
 
3
- from ..lite.maysyncs import MaysyncFn
4
- from ..lite.maysyncs import MaysyncGeneratorFn
5
- from ..lite.maysyncs import make_maysync as _make_maysync
3
+ from ..lite.maysync import MaysyncFn
4
+ from ..lite.maysync import MaysyncGeneratorFn
5
+ from ..lite.maysync import make_maysync as _make_maysync
6
6
  from .functions import as_async
7
7
 
8
8
 
@@ -1,11 +1,21 @@
1
1
  from .abstract import ( # noqa
2
2
  AbstractLifecycle,
3
+
4
+ AbstractAsyncLifecycle,
3
5
  )
4
6
 
5
7
  from .base import ( # noqa
8
+ AnyLifecycleCallback,
9
+ AnyLifecycle,
10
+ AnyCallbackLifecycle,
11
+
12
+ LifecycleCallback,
6
13
  CallbackLifecycle,
7
14
  Lifecycle,
8
- LifecycleCallback,
15
+
16
+ AsyncLifecycleCallback,
17
+ CallbackAsyncLifecycle,
18
+ AsyncLifecycle,
9
19
  )
10
20
 
11
21
  from .contextmanagers import ( # noqa
@@ -14,6 +24,9 @@ from .contextmanagers import ( # noqa
14
24
  )
15
25
 
16
26
  from .controller import ( # noqa
27
+ AnyLifecycleListener,
28
+ AnyLifecycleController,
29
+
17
30
  LifecycleController,
18
31
  LifecycleListener,
19
32
  )
@@ -3,11 +3,14 @@ import typing as ta
3
3
  from .. import cached
4
4
  from .. import dataclasses as dc
5
5
  from .. import lang
6
+ from .base import AsyncLifecycle
6
7
  from .base import Lifecycle
7
8
 
8
9
 
9
10
  AbstractLifecycleT = ta.TypeVar('AbstractLifecycleT', bound='AbstractLifecycle')
10
11
 
12
+ AbstractAsyncLifecycleT = ta.TypeVar('AbstractAsyncLifecycleT', bound='AbstractAsyncLifecycle')
13
+
11
14
 
12
15
  ##
13
16
 
@@ -44,3 +47,40 @@ class AbstractLifecycle(lang.Abstract):
44
47
 
45
48
  def _lifecycle_destroy(self) -> None:
46
49
  pass
50
+
51
+
52
+ ##
53
+
54
+
55
+ class AbstractAsyncLifecycle(lang.Abstract):
56
+ @dc.dataclass(frozen=True)
57
+ class _Lifecycle(AsyncLifecycle, lang.Final, ta.Generic[AbstractAsyncLifecycleT]):
58
+ obj: AbstractAsyncLifecycleT
59
+
60
+ async def lifecycle_construct(self) -> None:
61
+ await self.obj._lifecycle_construct() # noqa
62
+
63
+ async def lifecycle_start(self) -> None:
64
+ await self.obj._lifecycle_start() # noqa
65
+
66
+ async def lifecycle_stop(self) -> None:
67
+ await self.obj._lifecycle_stop() # noqa
68
+
69
+ async def lifecycle_destroy(self) -> None:
70
+ await self.obj._lifecycle_destroy() # noqa
71
+
72
+ @cached.property
73
+ def _lifecycle(self) -> _Lifecycle[ta.Self]:
74
+ return AbstractAsyncLifecycle._Lifecycle(self)
75
+
76
+ async def _lifecycle_construct(self) -> None:
77
+ pass
78
+
79
+ async def _lifecycle_start(self) -> None:
80
+ pass
81
+
82
+ async def _lifecycle_stop(self) -> None:
83
+ pass
84
+
85
+ async def _lifecycle_destroy(self) -> None:
86
+ pass
omlish/lifecycles/base.py CHANGED
@@ -4,50 +4,100 @@ from .. import dataclasses as dc
4
4
  from .. import lang
5
5
 
6
6
 
7
+ R = ta.TypeVar('R')
8
+
9
+ AnyLifecycleT = ta.TypeVar('AnyLifecycleT', bound='AnyLifecycle')
10
+ AnyLifecycleCallback: ta.TypeAlias = ta.Callable[[AnyLifecycleT], R]
11
+
7
12
  LifecycleT = ta.TypeVar('LifecycleT', bound='Lifecycle')
8
- LifecycleCallback: ta.TypeAlias = ta.Callable[[LifecycleT], None]
13
+ LifecycleCallback: ta.TypeAlias = ta.Callable[[LifecycleT], R]
14
+
15
+ AsyncLifecycleT = ta.TypeVar('AsyncLifecycleT', bound='AsyncLifecycle')
16
+ AsyncLifecycleCallback: ta.TypeAlias = ta.Callable[[AsyncLifecycleT], R]
9
17
 
10
18
 
11
19
  ##
12
20
 
13
21
 
14
- class Lifecycle:
15
- def lifecycle_construct(self) -> None:
16
- pass
22
+ class AnyLifecycle(lang.Abstract, ta.Generic[R]):
23
+ def lifecycle_construct(self) -> R | None:
24
+ return None
17
25
 
18
- def lifecycle_start(self) -> None:
19
- pass
26
+ def lifecycle_start(self) -> R | None:
27
+ return None
20
28
 
21
- def lifecycle_stop(self) -> None:
22
- pass
29
+ def lifecycle_stop(self) -> R | None:
30
+ return None
23
31
 
24
- def lifecycle_destroy(self) -> None:
25
- pass
32
+ def lifecycle_destroy(self) -> R | None:
33
+ return None
26
34
 
27
35
 
28
36
  @dc.dataclass(frozen=True, kw_only=True)
29
- class CallbackLifecycle(Lifecycle, lang.Final, ta.Generic[LifecycleT]):
30
- on_construct: LifecycleCallback['CallbackLifecycle[LifecycleT]'] | None = None
31
- on_start: LifecycleCallback['CallbackLifecycle[LifecycleT]'] | None = None
32
- on_stop: LifecycleCallback['CallbackLifecycle[LifecycleT]'] | None = None
33
- on_destroy: LifecycleCallback['CallbackLifecycle[LifecycleT]'] | None = None
37
+ class AnyCallbackLifecycle(
38
+ AnyLifecycle[R],
39
+ lang.Abstract,
40
+ ta.Generic[AnyLifecycleT, R],
41
+ ):
42
+ on_construct: AnyLifecycleCallback['AnyCallbackLifecycle[AnyLifecycleT, R]', R] | None = None
43
+ on_start: AnyLifecycleCallback['AnyCallbackLifecycle[AnyLifecycleT, R]', R] | None = None
44
+ on_stop: AnyLifecycleCallback['AnyCallbackLifecycle[AnyLifecycleT, R]', R] | None = None
45
+ on_destroy: AnyLifecycleCallback['AnyCallbackLifecycle[AnyLifecycleT, R]', R] | None = None
34
46
 
35
47
  @ta.override
36
- def lifecycle_construct(self) -> None:
48
+ def lifecycle_construct(self) -> R | None:
37
49
  if self.on_construct is not None:
38
- self.on_construct(self)
50
+ return self.on_construct(self)
51
+ else:
52
+ return None
39
53
 
40
54
  @ta.override
41
- def lifecycle_start(self) -> None:
55
+ def lifecycle_start(self) -> R | None:
42
56
  if self.on_start is not None:
43
- self.on_start(self)
57
+ return self.on_start(self)
58
+ else:
59
+ return None
44
60
 
45
61
  @ta.override
46
- def lifecycle_stop(self) -> None:
62
+ def lifecycle_stop(self) -> R | None:
47
63
  if self.on_stop is not None:
48
- self.on_stop(self)
64
+ return self.on_stop(self)
65
+ else:
66
+ return None
49
67
 
50
68
  @ta.override
51
- def lifecycle_destroy(self) -> None:
69
+ def lifecycle_destroy(self) -> R | None:
52
70
  if self.on_destroy is not None:
53
- self.on_destroy(self)
71
+ return self.on_destroy(self)
72
+ else:
73
+ return None
74
+
75
+
76
+ ##
77
+
78
+
79
+ class Lifecycle(AnyLifecycle[None]):
80
+ pass
81
+
82
+
83
+ class CallbackLifecycle(
84
+ AnyCallbackLifecycle[LifecycleT, None],
85
+ lang.Final,
86
+ ta.Generic[LifecycleT],
87
+ ):
88
+ pass
89
+
90
+
91
+ ##
92
+
93
+
94
+ class AsyncLifecycle(AnyLifecycle[ta.Awaitable[None]]):
95
+ pass
96
+
97
+
98
+ class CallbackAsyncLifecycle(
99
+ AnyCallbackLifecycle[LifecycleT, ta.Awaitable[None]],
100
+ lang.Final,
101
+ ta.Generic[LifecycleT],
102
+ ):
103
+ pass
@@ -1,99 +1,95 @@
1
+ import abc
1
2
  import typing as ta
2
3
 
3
4
  from .. import check
4
5
  from .. import defs
5
6
  from .. import lang
6
- from .base import Lifecycle
7
+ from .base import AnyLifecycle # noqa
8
+ from .base import Lifecycle # noqa
7
9
  from .states import LifecycleState
8
10
  from .states import LifecycleStates
9
11
  from .transitions import LifecycleTransition
10
12
  from .transitions import LifecycleTransitions
11
13
 
12
14
 
15
+ R = ta.TypeVar('R')
16
+
17
+ AnyLifecycleT = ta.TypeVar('AnyLifecycleT', bound='AnyLifecycle')
18
+
13
19
  LifecycleT = ta.TypeVar('LifecycleT', bound='Lifecycle')
14
20
 
15
21
 
16
22
  ##
17
23
 
18
24
 
19
- class LifecycleListener(ta.Generic[LifecycleT]):
20
- def on_starting(self, obj: LifecycleT) -> None:
21
- pass
25
+ class AnyLifecycleListener(ta.Generic[AnyLifecycleT, R]):
26
+ def on_starting(self, obj: AnyLifecycleT) -> R | None:
27
+ return None
22
28
 
23
- def on_started(self, obj: LifecycleT) -> None:
24
- pass
29
+ def on_started(self, obj: AnyLifecycleT) -> R | None:
30
+ return None
25
31
 
26
- def on_stopping(self, obj: LifecycleT) -> None:
27
- pass
32
+ def on_stopping(self, obj: AnyLifecycleT) -> R | None:
33
+ return None
28
34
 
29
- def on_stopped(self, obj: LifecycleT) -> None:
30
- pass
35
+ def on_stopped(self, obj: AnyLifecycleT) -> R | None:
36
+ return None
31
37
 
32
38
 
33
- class LifecycleController(Lifecycle, ta.Generic[LifecycleT]):
39
+ class AnyLifecycleController(AnyLifecycle[R], lang.Abstract, ta.Generic[AnyLifecycleT, R]):
34
40
  def __init__(
35
41
  self,
36
- lifecycle: LifecycleT,
37
- *,
38
- lock: lang.DefaultLockable = None,
42
+ lifecycle: AnyLifecycleT,
39
43
  ) -> None:
40
44
  super().__init__()
41
45
 
42
- self._lifecycle: LifecycleT = check.isinstance(lifecycle, Lifecycle) # type: ignore
43
- self._lock = lang.default_lock(lock, False)
46
+ self._lifecycle: AnyLifecycleT = check.isinstance(lifecycle, AnyLifecycle) # type: ignore
44
47
 
45
48
  self._state = LifecycleStates.NEW
46
- self._listeners: list[LifecycleListener[LifecycleT]] = []
49
+ self._listeners: list[AnyLifecycleListener[AnyLifecycleT, R]] = []
47
50
 
48
51
  defs.repr('lifecycle', 'state')
49
52
 
50
53
  @property
51
- def lifecycle(self) -> LifecycleT:
54
+ def lifecycle(self) -> AnyLifecycleT:
52
55
  return self._lifecycle
53
56
 
54
57
  @property
55
58
  def state(self) -> LifecycleState:
56
59
  return self._state
57
60
 
58
- def add_listener(self, listener: LifecycleListener[LifecycleT]) -> 'LifecycleController':
59
- self._listeners.append(check.isinstance(listener, LifecycleListener))
61
+ def add_listener(self, listener: AnyLifecycleListener[AnyLifecycleT, R]) -> ta.Self:
62
+ self._listeners.append(check.isinstance(listener, AnyLifecycleListener))
60
63
  return self
61
64
 
65
+ @abc.abstractmethod
62
66
  def _advance(
63
67
  self,
64
68
  transition: LifecycleTransition,
65
- lifecycle_fn: ta.Callable[[], None],
66
- pre_listener_fn: ta.Callable[[LifecycleListener[LifecycleT]], ta.Callable[[LifecycleT], None]] | None = None, # noqa
67
- post_listener_fn: ta.Callable[[LifecycleListener[LifecycleT]], ta.Callable[[LifecycleT], None]] | None = None, # noqa
68
- ) -> None:
69
- with self._lock():
70
- if pre_listener_fn is not None:
71
- for listener in self._listeners:
72
- pre_listener_fn(listener)(self._lifecycle)
73
- check.state(self._state in transition.old)
74
- self._state = transition.new_intermediate
75
- try:
76
- lifecycle_fn()
77
- except Exception:
78
- self._state = transition.new_failed
79
- raise
80
- self._state = transition.new_succeeded
81
- if post_listener_fn is not None:
82
- for listener in self._listeners:
83
- post_listener_fn(listener)(self._lifecycle)
69
+ lifecycle_fn: ta.Callable[[], R | None],
70
+ pre_listener_fn: ta.Callable[
71
+ [AnyLifecycleListener[AnyLifecycleT, R]],
72
+ ta.Callable[[AnyLifecycleT], R | None],
73
+ ] | None = None,
74
+ post_listener_fn: ta.Callable[
75
+ [AnyLifecycleListener[AnyLifecycleT, R]],
76
+ ta.Callable[[AnyLifecycleT], R | None],
77
+ ] | None = None,
78
+ ) -> R | None:
79
+ raise NotImplementedError
84
80
 
85
81
  ##
86
82
 
87
83
  @ta.override
88
- def lifecycle_construct(self) -> None:
89
- self._advance(
84
+ def lifecycle_construct(self) -> R | None:
85
+ return self._advance(
90
86
  LifecycleTransitions.CONSTRUCT,
91
87
  self._lifecycle.lifecycle_construct,
92
88
  )
93
89
 
94
90
  @ta.override
95
- def lifecycle_start(self) -> None:
96
- self._advance(
91
+ def lifecycle_start(self) -> R | None:
92
+ return self._advance(
97
93
  LifecycleTransitions.START,
98
94
  self._lifecycle.lifecycle_start,
99
95
  lambda l: l.on_starting,
@@ -101,8 +97,8 @@ class LifecycleController(Lifecycle, ta.Generic[LifecycleT]):
101
97
  )
102
98
 
103
99
  @ta.override
104
- def lifecycle_stop(self) -> None:
105
- self._advance(
100
+ def lifecycle_stop(self) -> R | None:
101
+ return self._advance(
106
102
  LifecycleTransitions.STOP,
107
103
  self._lifecycle.lifecycle_stop,
108
104
  lambda l: l.on_stopping,
@@ -110,8 +106,59 @@ class LifecycleController(Lifecycle, ta.Generic[LifecycleT]):
110
106
  )
111
107
 
112
108
  @ta.override
113
- def lifecycle_destroy(self) -> None:
114
- self._advance(
109
+ def lifecycle_destroy(self) -> R | None:
110
+ return self._advance(
115
111
  LifecycleTransitions.DESTROY,
116
112
  self._lifecycle.lifecycle_destroy,
117
113
  )
114
+
115
+
116
+ ##
117
+
118
+
119
+ LifecycleListener: ta.TypeAlias = AnyLifecycleListener[LifecycleT, None]
120
+
121
+
122
+ class LifecycleController(
123
+ AnyLifecycleController[LifecycleT, None],
124
+ Lifecycle,
125
+ ta.Generic[LifecycleT],
126
+ ):
127
+ def __init__(
128
+ self,
129
+ lifecycle: LifecycleT,
130
+ *,
131
+ lock: lang.DefaultLockable = None,
132
+ ) -> None:
133
+ super().__init__(lifecycle)
134
+
135
+ self._lock = lang.default_lock(lock, False)
136
+
137
+ def _advance(
138
+ self,
139
+ transition: LifecycleTransition,
140
+ lifecycle_fn: ta.Callable[[], None],
141
+ pre_listener_fn: ta.Callable[
142
+ [LifecycleListener[LifecycleT]],
143
+ ta.Callable[[LifecycleT], None],
144
+ ] | None = None,
145
+ post_listener_fn: ta.Callable[
146
+ [LifecycleListener[LifecycleT]],
147
+ ta.Callable[[LifecycleT], None],
148
+ ] | None = None,
149
+ ) -> None:
150
+ with self._lock():
151
+ if pre_listener_fn is not None:
152
+ for listener in self._listeners:
153
+ pre_listener_fn(listener)(self._lifecycle)
154
+ check.state(self._state in transition.old)
155
+ self._state = transition.new_intermediate
156
+ try:
157
+ lifecycle_fn()
158
+ except Exception:
159
+ self._state = transition.new_failed
160
+ raise
161
+ self._state = transition.new_succeeded
162
+ if post_listener_fn is not None:
163
+ for listener in self._listeners:
164
+ post_listener_fn(listener)(self._lifecycle)
@@ -53,6 +53,7 @@ class Registry(ta.Generic[RegistryItemT]):
53
53
  self._dct: dict[ta.Any, _KeyRegistryItems[RegistryItemT]] = {}
54
54
  self._id_dct: ta.MutableMapping[ta.Any, _KeyRegistryItems[RegistryItemT]] = col.IdentityKeyDict()
55
55
 
56
+ self._version = 0
56
57
  self._sealed = False
57
58
 
58
59
  #
@@ -84,6 +85,9 @@ class Registry(ta.Generic[RegistryItemT]):
84
85
  *items: RegistryItemT,
85
86
  identity: bool = False,
86
87
  ) -> ta.Self:
88
+ if not items:
89
+ return self
90
+
87
91
  with self._lock:
88
92
  if self._sealed:
89
93
  raise RegistrySealedError(self)
@@ -93,6 +97,8 @@ class Registry(ta.Generic[RegistryItemT]):
93
97
  sr = dct[key] = _KeyRegistryItems(key)
94
98
  sr.add(*items)
95
99
 
100
+ self._version += 1
101
+
96
102
  return self
97
103
 
98
104
  #
omlish/math/__init__.py CHANGED
@@ -1,83 +1,89 @@
1
- from .bits import ( # noqa
2
- get_bit,
3
- get_bits,
4
- set_bit,
5
- set_bits,
6
- )
7
-
8
- from .c import ( # noqa
9
- cdiv,
10
- cmod,
11
- )
12
-
13
- from .fixed import ( # noqa
14
- CheckedFixedWidthIntError,
15
- OverflowFixedWidthIntError,
16
- UnderflowFixedWidthIntError,
17
-
18
- FixedWidthInt,
19
-
20
- SignedInt,
21
- UnsignedInt,
22
-
23
- CheckedInt,
24
- ClampedInt,
25
-
26
- AnyInt8,
27
- AnyInt16,
28
- AnyInt32,
29
- AnyInt64,
30
- AnyInt128,
31
-
32
- CheckedInt8,
33
- CheckedInt16,
34
- CheckedInt32,
35
- CheckedInt64,
36
- CheckedInt128,
37
-
38
- CheckedUint8,
39
- CheckedUint16,
40
- CheckedUint32,
41
- CheckedUint64,
42
- CheckedUint128,
43
-
44
- ClampedInt8,
45
- ClampedInt16,
46
- ClampedInt32,
47
- ClampedInt64,
48
- ClampedInt128,
49
-
50
- ClampedUint8,
51
- ClampedUint16,
52
- ClampedUint32,
53
- ClampedUint64,
54
- ClampedUint128,
55
-
56
- WrappedInt8,
57
- WrappedInt16,
58
- WrappedInt32,
59
- WrappedInt64,
60
- WrappedInt128,
61
-
62
- WrappedUint8,
63
- WrappedUint16,
64
- WrappedUint32,
65
- WrappedUint64,
66
- WrappedUint128,
67
- )
68
-
69
- from .floats import ( # noqa
70
- isclose,
71
- float_to_bytes,
72
- bytes_to_float,
73
- )
74
-
75
- from .stats import ( # noqa
76
- get_quantile,
77
-
78
- Stats,
79
- )
80
-
81
- from .histogram import ( # noqa
82
- SamplingHistogram,
83
- )
1
+ from .. import lang as _lang
2
+
3
+
4
+ with _lang.auto_proxy_init(globals()):
5
+ ##
6
+
7
+ from .bits import ( # noqa
8
+ get_bit,
9
+ get_bits,
10
+ set_bit,
11
+ set_bits,
12
+ )
13
+
14
+ from .c import ( # noqa
15
+ cdiv,
16
+ cmod,
17
+ )
18
+
19
+ from .fixed import ( # noqa
20
+ CheckedFixedWidthIntError,
21
+ OverflowFixedWidthIntError,
22
+ UnderflowFixedWidthIntError,
23
+
24
+ FixedWidthInt,
25
+
26
+ SignedInt,
27
+ UnsignedInt,
28
+
29
+ CheckedInt,
30
+ ClampedInt,
31
+
32
+ AnyInt8,
33
+ AnyInt16,
34
+ AnyInt32,
35
+ AnyInt64,
36
+ AnyInt128,
37
+
38
+ CheckedInt8,
39
+ CheckedInt16,
40
+ CheckedInt32,
41
+ CheckedInt64,
42
+ CheckedInt128,
43
+
44
+ CheckedUint8,
45
+ CheckedUint16,
46
+ CheckedUint32,
47
+ CheckedUint64,
48
+ CheckedUint128,
49
+
50
+ ClampedInt8,
51
+ ClampedInt16,
52
+ ClampedInt32,
53
+ ClampedInt64,
54
+ ClampedInt128,
55
+
56
+ ClampedUint8,
57
+ ClampedUint16,
58
+ ClampedUint32,
59
+ ClampedUint64,
60
+ ClampedUint128,
61
+
62
+ WrappedInt8,
63
+ WrappedInt16,
64
+ WrappedInt32,
65
+ WrappedInt64,
66
+ WrappedInt128,
67
+
68
+ WrappedUint8,
69
+ WrappedUint16,
70
+ WrappedUint32,
71
+ WrappedUint64,
72
+ WrappedUint128,
73
+ )
74
+
75
+ from .floats import ( # noqa
76
+ isclose,
77
+ float_to_bytes,
78
+ bytes_to_float,
79
+ )
80
+
81
+ from .stats import ( # noqa
82
+ get_quantile,
83
+
84
+ Stats,
85
+ )
86
+
87
+ from .histogram import ( # noqa
88
+ SamplingHistogram,
89
+ )
@@ -4,7 +4,7 @@ import abc
4
4
  import sys
5
5
  import typing as ta
6
6
 
7
- from ..lite.maysyncs import make_maysync
7
+ from ..lite.maysync import make_maysync
8
8
  from .asyncs import AbstractAsyncSubprocesses
9
9
  from .run import SubprocessRun
10
10
  from .run import SubprocessRunOutput
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev418
3
+ Version: 0.0.0.dev419
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -132,7 +132,7 @@ dependencies of any kind**.
132
132
  of the presence or absence of an object, as in [many](https://en.cppreference.com/w/cpp/utility/optional)
133
133
  [other](https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html)
134
134
  [languages](https://doc.rust-lang.org/std/option/).
135
- - **[maysyncs](https://github.com/wrmsr/omlish/blob/master/omlish/lite/maysyncs.py)** - A lightweight means of sharing
135
+ - **[maysync](https://github.com/wrmsr/omlish/blob/master/omlish/lite/maysync.py)** - A lightweight means of sharing
136
136
  code between sync and async contexts, eliminating the need for maintaining sync and async versions of functions.
137
137
 
138
138
  - **[bootstrap](https://github.com/wrmsr/omlish/blob/master/omlish/bootstrap)** - A centralized, configurable,
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=FLw7xkPiSXuImZgqSP8BwrEib2R1doSzUPLUkc-QUIA,8410
2
- omlish/__about__.py,sha256=E7iojn9stTJMHyoeJLNlAbIfcUFXWRFTEiaSQK7iYOo,3568
2
+ omlish/__about__.py,sha256=wXkYG_Y6_dahHEzlSoF0MBVQcUkILpOeAz1OmAcP31I,3568
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
@@ -129,7 +129,7 @@ omlish/configs/processing/rewriting.py,sha256=2zmyf7HcdN6kfuO9UGA88yeA_0A3xToUZe
129
129
  omlish/configs/processing/strings.py,sha256=Iw85H_AE2TG8vdpbgwhye-aqz5Hkn4J9mM32FdXEiGo,832
130
130
  omlish/daemons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
131
  omlish/daemons/daemon.py,sha256=pUwomapIrUwXLnov9jlA5EU1vp4qEYcIiUxKD3SQyVo,3479
132
- omlish/daemons/launching.py,sha256=sNOYW939IGI4ZlLQ0bKxzXj6EyeOiwV7Upqhd5XfoHc,3747
132
+ omlish/daemons/launching.py,sha256=OGr32q-g5fVHrIXfrXacCcwtpTEAKgO9EQtEQKmdf0s,3749
133
133
  omlish/daemons/reparent.py,sha256=uEs7pjzQkL8zhM8xADJhedmXXA7eDsu28639F5HkmpU,590
134
134
  omlish/daemons/services.py,sha256=laoUeJU7eVHuWl1062FBjPSD7jchOjhpYDc5FT2B3dM,3462
135
135
  omlish/daemons/spawning.py,sha256=psR73zOYjMKTqNpx1bMib8uU9wAZz62tw5TaWHrTdyY,5337
@@ -280,7 +280,7 @@ omlish/formats/json/backends/__init__.py,sha256=K5nAP-fCgUvaSylHqgRvmJp6j6PTWdMj
280
280
  omlish/formats/json/backends/base.py,sha256=Sv3lfDEx8X8t1yVerOGyN-ra3LeJDTKzuSsW9EBBxIk,1119
281
281
  omlish/formats/json/backends/default.py,sha256=PXVM8kM0LWRA1-aEAJ0JMfu9BDuHpPFCDgBme6JNdAw,1317
282
282
  omlish/formats/json/backends/jiter.py,sha256=8qv_XWGpcupPtVm6Z_egHio_iY1Kk8eqkvXTF6fVZr4,1193
283
- omlish/formats/json/backends/orjson.py,sha256=dHrD75f0ZOHve80Xpq8A2_ec69kXcj4nEM-pIdiemtU,3805
283
+ omlish/formats/json/backends/orjson.py,sha256=X2jhKgUYYwaVuAppPQmfyncbOs2PJ7drqH5BioP-AYI,3831
284
284
  omlish/formats/json/backends/std.py,sha256=Hhiug5CkC1TXLFrE9rnMR2on7xP-RliSvfYA9ill_U0,3159
285
285
  omlish/formats/json/backends/ujson.py,sha256=U3iOlAURfiCdXbiNlXfIjDdtJDbDaLZsSuZriTUvbxs,2307
286
286
  omlish/formats/json/stream/__init__.py,sha256=LOQvJGUEqvm1exve1hnWoO3mlMadShaO2Cy7XjCiWbA,829
@@ -304,7 +304,7 @@ omlish/formats/json5/_antlr/Json5Visitor.py,sha256=fIp5GhQ2Sd-bKEBBcBd31FOoCLiV1
304
304
  omlish/formats/json5/_antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
305
305
  omlish/formats/toml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
306
306
  omlish/formats/toml/codec.py,sha256=5HFGWEPd9IFxPlRMRheX8FEDlRIzLe1moHEOj2_PFKU,342
307
- omlish/formats/toml/parser.py,sha256=O2M0penQV3t8NAsq_conJjvTsXI8iivUFuBg2a5J3dU,30643
307
+ omlish/formats/toml/parser.py,sha256=aaZlEEPk0IQhfux_kjCY2K5mYYYDPNQ-4wWgZXskoAM,30675
308
308
  omlish/formats/toml/writer.py,sha256=9NT8sRy3I9KubxFx56Qbislvrdtbd23rEuBT-GSdUYA,3232
309
309
  omlish/funcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
310
310
  omlish/funcs/builders.py,sha256=Av41RkDFbsVGzQ7cWzevCG-UqZhLCBSDT8DhyWKq1rQ,4006
@@ -424,14 +424,14 @@ omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8
424
424
  omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
425
425
  omlish/iterators/tools.py,sha256=M16LXrJhMdsz5ea2qH0vws30ZvhQuQSCVFSLpRf_gTg,2096
426
426
  omlish/iterators/unique.py,sha256=BSE-eanva8byFCJi09Nt2zzTsVr8LnTqY1PIInGYRs0,1396
427
- omlish/lang/__init__.py,sha256=dyVY_3Scl1EWXXN4Pb26y4C7FVnBATP1KKfng2qbhag,9415
427
+ omlish/lang/__init__.py,sha256=uquYJI6DghD_i3axIHlaP66ei8xp4exV1AO5BtoGFzg,9725
428
428
  omlish/lang/asyncs.py,sha256=SmzkYghQID77vcgm1Evnd3r9_jd5DlfzJ8uQK7nkh0E,1517
429
429
  omlish/lang/attrs.py,sha256=zFiVuGVOq88x45464T_LxDa-ZEq_RD9zJLq2zeVEBDc,5105
430
430
  omlish/lang/casing.py,sha256=cFUlbDdXLhwnWwcYx4qnM5c4zGX7hIRUfcjiZbxUD28,4636
431
431
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
432
432
  omlish/lang/collections.py,sha256=XI76WcSi4SclWmEGirErg7EzQUfjtmiK2xSK7jJISzY,2528
433
433
  omlish/lang/comparison.py,sha256=MOwEG0Yny-jBPHO9kQto9FSRyeNpQW24UABsghkrHxY,1356
434
- omlish/lang/contextmanagers.py,sha256=S4Dg_XqyP_ObmnEyKIDMVSCgyXV79IrvptZWsYSqFlM,7686
434
+ omlish/lang/contextmanagers.py,sha256=aL2KPRq7b6ULp9lQDbxVLe0fOjutrhnRPHbxeWXgeKA,9010
435
435
  omlish/lang/datetimes.py,sha256=01tg21QOx-PWDlm-CSFTalym3vpqF0EKzeinmtcVNoU,379
436
436
  omlish/lang/descriptors.py,sha256=sVJ1Pr4ihp26Tu9UCvDSyfSf-DhBnFGnbpYIFF32c7g,6877
437
437
  omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
@@ -441,7 +441,7 @@ omlish/lang/generators.py,sha256=a4D5HU_mySs2T2z3xCmE_s3t4QJkj0YRrK4-hhpGd0A,519
441
441
  omlish/lang/iterables.py,sha256=y1SX2Co3VsOeX2wlfFF7K3rwLvF7Dtre7VY6EpfwAwA,3338
442
442
  omlish/lang/lazyglobals.py,sha256=G1hwpyIgM4PUkVJ_St3K-EdQkHQdWpFOcXao6I5LwyY,1435
443
443
  omlish/lang/maybes.py,sha256=ES1LK-9ebh2GNKZ7YfrS4OEoYHFhfiWkme4wU6Blzo4,77
444
- omlish/lang/maysyncs.py,sha256=S90OrGQ8OShmcg7dt0Tf1GLTGCKwOPO80PRzaZHKsxY,1630
444
+ omlish/lang/maysync.py,sha256=Yt0iFeEm53-iQTq91oCqeDqe5i1I-H7yL5ORe9zhx9U,1627
445
445
  omlish/lang/objects.py,sha256=eOhFyFiwvxqpbLs5QTEkXU3rdSt_tQXDgHoWF5SA28E,6119
446
446
  omlish/lang/outcomes.py,sha256=0PqxoKaGbBXU9UYZ6AE2QSq94Z-gFDt6wYdp0KomNQw,8712
447
447
  omlish/lang/overrides.py,sha256=IBzK6ljfLX6TLgIyKTSjhqTLcuKRkQNVtEOnBLS4nuA,2095
@@ -466,14 +466,14 @@ omlish/lang/classes/virtual.py,sha256=z0MYQD9Q5MkX8DzF325wDB4J9XoYbsB09jZ1omC62T
466
466
  omlish/lang/imports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
467
467
  omlish/lang/imports/conditional.py,sha256=R-E47QD95mMonPImWlrde3rnJrFKCCkYz71c94W05sc,1006
468
468
  omlish/lang/imports/lazy.py,sha256=Fhtb5tSAttff6G2pZdF8bh__GZlqJWHaMKtA8KubuX4,1479
469
- omlish/lang/imports/proxyinit.py,sha256=j3RMoA1Mop8XOspLQLkAoGQg0OZFpU6-BpXHoP7qa-0,19613
469
+ omlish/lang/imports/proxyinit.py,sha256=Mw3_Or0x8Gz0YrMBIdyfdALnqNi4HXgv6ZZQDPMWL_o,19629
470
470
  omlish/lang/imports/resolving.py,sha256=DeRarn35Fryg5JhVhy8wbiC9lvr58AnllI9B_reswUE,2085
471
471
  omlish/lang/imports/traversal.py,sha256=pbFQIa880NGjSfcLsno2vE_G41_CLwDHb-7gWg2J3BI,2855
472
- omlish/lifecycles/__init__.py,sha256=1FjYceXs-4fc-S-C9zFYmc2axHs4znnQHcJVHdY7a6E,578
473
- omlish/lifecycles/abstract.py,sha256=c9UY7oxzYZ_neh5DPE4yv5HfuDv7B4Mj_9Zo-B8KDSs,1114
474
- omlish/lifecycles/base.py,sha256=DeUxARnOufWfBvhZQbonl1RVJgbrSeK5QNM6dWEuOwA,1398
472
+ omlish/lifecycles/__init__.py,sha256=zOuvV4pErPwxcKUSgshmME2Duw9GrjwckpNmW3FPKng,810
473
+ omlish/lifecycles/abstract.py,sha256=1nMCFVislFq-boMD6TK9APIkRm_5OzcpSsDs2XnByVQ,2248
474
+ omlish/lifecycles/base.py,sha256=sCmzj2F-JcFD2qDsjNOPhKSbDIJaT9CEKK19RqkP-sg,2462
475
475
  omlish/lifecycles/contextmanagers.py,sha256=JAGYm11JYHDaq-9Vs5gPPQZMLTQDeHQWvWhcCVX4Qag,2078
476
- omlish/lifecycles/controller.py,sha256=U_4mfp3n0zxH3RgFrcAi6yODuLIR5RF-uwB2tEBdXIY,3467
476
+ omlish/lifecycles/controller.py,sha256=DkbwzwVLuP9ZvG67jmhfW-am4YbcsE2qLNC82lVTXWw,4756
477
477
  omlish/lifecycles/manager.py,sha256=92s1IH_gDP25PM5tFuPMP2hD_6s5fPi_VzZiDS5549g,5449
478
478
  omlish/lifecycles/states.py,sha256=6gTdY3hn7-1sJ60lA3GeMx5RVKvXtFBBXE4KEjoO1Hs,1297
479
479
  omlish/lifecycles/transitions.py,sha256=3IFdWGtAeoy3XRlIyW7yCKV4e4Iof9ytkqklGMRFYQs,1944
@@ -490,7 +490,7 @@ omlish/lite/json.py,sha256=m0Ce9eqUZG23-H7-oOp8n1sf4fzno5vtK4AK_4Vc-Mg,706
490
490
  omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
491
491
  omlish/lite/marshal.py,sha256=K_wnZwfC8cftGILyE3RlmzQEYuZOfzkMLKey41zuwtM,20296
492
492
  omlish/lite/maybes.py,sha256=0p_fzb6yiOjEpvMKaQ53Q6CH1VPW1or7v7Lt1JIKcgM,4359
493
- omlish/lite/maysyncs.py,sha256=9_u3sS2VacmfffBjbUYiu5eYG2XJ2lCIpYewwbmvPDc,14391
493
+ omlish/lite/maysync.py,sha256=9_u3sS2VacmfffBjbUYiu5eYG2XJ2lCIpYewwbmvPDc,14391
494
494
  omlish/lite/pycharm.py,sha256=FRHGcCDo42UzZXqNwW_DkhI-6kb_CmJKPiQ8F6mYkLA,1174
495
495
  omlish/lite/reflect.py,sha256=gI-Qlws9V-jND7kvCQFaIhBFrndVpDsikTQ7C6U2z3w,2434
496
496
  omlish/lite/reprs.py,sha256=2Bc7ukhKvYNTKmxPIuv9glZIph13C37y_W4fg9pBnu8,2006
@@ -534,7 +534,7 @@ omlish/marshal/base/errors.py,sha256=jmN3vl_U_hB6L0wAvuO7ORG27vXF7KEUk-1TxxK2mYA
534
534
  omlish/marshal/base/funcs.py,sha256=OeSb8T3R0HZmEnAI4lOhI1HPRurTAezzV3TZWdGGK9s,1558
535
535
  omlish/marshal/base/options.py,sha256=OoDErPmI0kswnqAtr7QYndlPYhIqIDarx833tKFT2R4,23
536
536
  omlish/marshal/base/overrides.py,sha256=543hP4_y2JRThUOamCE0dPfgucbepVV8e_YF-_PJk6U,993
537
- omlish/marshal/base/registries.py,sha256=lEpnKnIo0AANOk_PQ6nlEOpPcVa554I3zF0EsT8WuXU,3311
537
+ omlish/marshal/base/registries.py,sha256=CHxjr2VPEwh2NwmnCB17AMY3YE9mWT9kUtPNiyTzGM8,3416
538
538
  omlish/marshal/base/types.py,sha256=DBczbVhz9z9zM4uux43KUnCEJUIW_JqVNyXMxPd--Cs,2472
539
539
  omlish/marshal/base/values.py,sha256=QF6OateG5kjRPHYza08wscThhg20oryf-aVQrxjfkC0,212
540
540
  omlish/marshal/composite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -581,7 +581,7 @@ omlish/marshal/trivial/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
581
581
  omlish/marshal/trivial/any.py,sha256=XaqSW0fyq2FVE4PQ4IG0UaXr59kRVGccgZDlsNHrd_Q,852
582
582
  omlish/marshal/trivial/forbidden.py,sha256=fkvyBViUjrpfB6JJu47k-yxAvLkJw7JSZqSP-Abr_04,1092
583
583
  omlish/marshal/trivial/nop.py,sha256=PDXT0B9RR-ghG6ExuK9BH2J-nHEnoTYGNdVaNAyRzSk,506
584
- omlish/math/__init__.py,sha256=0N2LtQYsAit7wXDKa-Dj6XPkVzEviP-tB2BNQoMhzLI,1185
584
+ omlish/math/__init__.py,sha256=bcdEEM3l4YNPJvTY_gD-7ARa5HEBNFTfvkVDTTzaNOQ,1531
585
585
  omlish/math/bits.py,sha256=pcTuWxNXXfG-CtTITNNbW3YConAkCeU8PLNcglCc43E,533
586
586
  omlish/math/c.py,sha256=JUHHZfVUUE4sb-6_LxJksbcLOLi9za0LdPs4dky5Ba8,308
587
587
  omlish/math/fixed.py,sha256=pplyqqD6BxZWS9UEc8MHLsiMwx0-D1GLTeB8EL6yxHs,7419
@@ -779,7 +779,7 @@ omlish/subprocesses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
779
779
  omlish/subprocesses/asyncs.py,sha256=G9wj275s3r0ueftHFl73Lt4kMRBc2hJOKcoJQCDlBms,2663
780
780
  omlish/subprocesses/base.py,sha256=r60N3ad4ooSvdgFmT94L_xZEy7FMbMX6JcG2VgpHo6w,6139
781
781
  omlish/subprocesses/editor.py,sha256=xBrd7gY0akhRfDIBK5YIBrYMHECtl_8r499iKViyfpQ,2634
782
- omlish/subprocesses/maysyncs.py,sha256=y4q-LnuSYRmiCrncGoa9SwejCSWnq0Cnzzu9qHcq5EE,1445
782
+ omlish/subprocesses/maysync.py,sha256=zMs54wliA5-Kd986shgo4YY3W_4pOCJKpIrun0VYPyM,1444
783
783
  omlish/subprocesses/run.py,sha256=8EeMm2FdNEFmEmbhhzJyHXASUhCCMMRN_-8ybqFhgLI,4378
784
784
  omlish/subprocesses/sync.py,sha256=L-ZNj9RrZd69XjlKrXjt-EJ-XUpQF8E35Mh3b3SI3vc,3671
785
785
  omlish/subprocesses/utils.py,sha256=v5uEzxmbmRvXwOl_0DtBa5Il6yITKYRgmVSGHcLsT4o,402
@@ -923,9 +923,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
923
923
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
924
924
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
925
925
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
926
- omlish-0.0.0.dev418.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
927
- omlish-0.0.0.dev418.dist-info/METADATA,sha256=URtPO-TW-SiCQpfOPv3fapEkG9oDcAdN3CIm5RCsbvA,19244
928
- omlish-0.0.0.dev418.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
929
- omlish-0.0.0.dev418.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
930
- omlish-0.0.0.dev418.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
931
- omlish-0.0.0.dev418.dist-info/RECORD,,
926
+ omlish-0.0.0.dev419.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
927
+ omlish-0.0.0.dev419.dist-info/METADATA,sha256=G3EL-J9uLveMopCZ00adkjfg8wh3IqMtmQm8iyZ0iGc,19242
928
+ omlish-0.0.0.dev419.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
929
+ omlish-0.0.0.dev419.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
930
+ omlish-0.0.0.dev419.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
931
+ omlish-0.0.0.dev419.dist-info/RECORD,,
File without changes