|
1 | | -from collections.abc import Callable, Iterator |
| 1 | +from collections.abc import AsyncIterator, Awaitable, Callable, Iterator |
2 | 2 | from functools import partial |
3 | 3 |
|
4 | | -from injection._core.common.invertible import Invertible, SimpleInvertible |
| 4 | +from injection._core.common.invertible import Invertible |
5 | 5 |
|
6 | 6 |
|
7 | | -def lazy[T](factory: Callable[..., T]) -> Invertible[T]: |
| 7 | +def lazy[T](factory: Callable[..., T]) -> Callable[[], T]: |
8 | 8 | def cache() -> Iterator[T]: |
9 | | - nonlocal factory |
10 | 9 | value = factory() |
11 | | - del factory |
| 10 | + while True: |
| 11 | + yield value |
| 12 | + |
| 13 | + return partial(next, cache()) |
12 | 14 |
|
| 15 | + |
| 16 | +def alazy[T](factory: Callable[..., Awaitable[T]]) -> Callable[[], Awaitable[T]]: |
| 17 | + async def cache() -> AsyncIterator[T]: |
| 18 | + value = await factory() |
13 | 19 | while True: |
14 | 20 | yield value |
15 | 21 |
|
16 | | - getter = partial(next, cache()) |
17 | | - return SimpleInvertible(getter) |
| 22 | + return partial(_anext, cache()) |
18 | 23 |
|
19 | 24 |
|
20 | 25 | class Lazy[T](Invertible[T]): |
21 | | - __slots__ = ("__invertible", "__is_set") |
| 26 | + __slots__ = ("__get", "__is_set") |
22 | 27 |
|
23 | | - __invertible: Invertible[T] |
| 28 | + __get: Callable[[], T] |
24 | 29 | __is_set: bool |
25 | 30 |
|
26 | 31 | def __init__(self, factory: Callable[..., T]) -> None: |
27 | 32 | @lazy |
28 | | - def invertible() -> T: |
| 33 | + def get() -> T: |
29 | 34 | value = factory() |
30 | 35 | self.__is_set = True |
31 | 36 | return value |
32 | 37 |
|
33 | | - self.__invertible = invertible |
| 38 | + self.__get = get |
34 | 39 | self.__is_set = False |
35 | 40 |
|
36 | 41 | def __invert__(self) -> T: |
37 | | - return ~self.__invertible |
| 42 | + return self.__get() |
38 | 43 |
|
39 | 44 | @property |
40 | 45 | def is_set(self) -> bool: |
41 | 46 | return self.__is_set |
| 47 | + |
| 48 | + |
| 49 | +async def _anext[T](async_iterator: AsyncIterator[T]) -> T: |
| 50 | + return await anext(async_iterator) |
0 commit comments