|
1 | | -from abc import ABC, abstractmethod |
2 | | -from typing import Callable, TypeVar, Generic |
| 1 | +from typing import Callable, TypeVar, Generic, Iterable, Sequence |
3 | 2 |
|
4 | | -from spellbind.emitters import Emitter, TriEmitter, BiEmitter, ValueEmitter |
5 | | -from spellbind.functions import assert_parameter_max_count |
| 3 | +from spellbind.emitters import Emitter, TriEmitter, BiEmitter, ValueEmitter, ValuesEmitter |
6 | 4 | from spellbind.observables import Observable, ValueObservable, BiObservable, TriObservable, Observer, \ |
7 | | - ValueObserver, BiObserver, TriObserver, Subscription, WeakSubscription, StrongSubscription, \ |
8 | | - RemoveSubscriptionError |
| 5 | + ValueObserver, BiObserver, TriObserver, ValuesObserver, ValuesObservable, _BaseObservable, _BaseValuesObservable, \ |
| 6 | + _SingleBaseObservable |
9 | 7 |
|
10 | 8 | _S = TypeVar("_S") |
11 | 9 | _T = TypeVar("_T") |
12 | 10 | _U = TypeVar("_U") |
13 | 11 | _O = TypeVar('_O', bound=Callable) |
14 | 12 |
|
15 | 13 |
|
16 | | -class _BaseEvent(Generic[_O], ABC): |
17 | | - _subscriptions: list[Subscription[_O]] |
18 | | - |
19 | | - def __init__(self): |
20 | | - self._subscriptions = [] |
21 | | - |
22 | | - @abstractmethod |
23 | | - def _get_parameter_count(self) -> int: ... |
24 | | - |
25 | | - def observe(self, observer: _O, times: int | None = None) -> None: |
26 | | - assert_parameter_max_count(observer, self._get_parameter_count()) |
27 | | - self._subscriptions.append(StrongSubscription(observer, times)) |
28 | | - |
29 | | - def weak_observe(self, observer: _O, times: int | None = None) -> None: |
30 | | - assert_parameter_max_count(observer, self._get_parameter_count()) |
31 | | - self._subscriptions.append(WeakSubscription(observer, times)) |
32 | | - |
33 | | - def unobserve(self, observer: _O) -> None: |
34 | | - for i, sub in enumerate(self._subscriptions): |
35 | | - if sub.matches_observer(observer): |
36 | | - del self._subscriptions[i] |
37 | | - return |
38 | | - raise ValueError(f"Observer {observer} is not subscribed to this event.") |
39 | | - |
40 | | - def is_observed(self, observer: _O) -> bool: |
41 | | - return any(sub.matches_observer(observer) for sub in self._subscriptions) |
42 | | - |
43 | | - def _emit(self, *args) -> None: |
44 | | - i = 0 |
45 | | - while i < len(self._subscriptions): |
46 | | - try: |
47 | | - self._subscriptions[i](*args) |
48 | | - i += 1 |
49 | | - except RemoveSubscriptionError: |
50 | | - del self._subscriptions[i] |
51 | | - |
52 | | - |
53 | | -class Event(_BaseEvent[Observer], Observable, Emitter): |
| 14 | +class Event(_BaseObservable[Observer], Observable, Emitter): |
54 | 15 | def _get_parameter_count(self) -> int: |
55 | 16 | return 0 |
56 | 17 |
|
57 | 18 | def __call__(self) -> None: |
58 | | - self._emit() |
| 19 | + self._emit_nothing() |
59 | 20 |
|
60 | 21 |
|
61 | | -class ValueEvent(Generic[_S], _BaseEvent[Observer | ValueObserver[_S]], ValueObservable[_S], ValueEmitter[_S]): |
| 22 | +class ValueEvent(Generic[_S], _SingleBaseObservable[Observer | ValueObserver[_S]], ValueObservable[_S], ValueEmitter[_S]): |
62 | 23 | def _get_parameter_count(self) -> int: |
63 | 24 | return 1 |
64 | 25 |
|
65 | 26 | def __call__(self, value: _S) -> None: |
66 | | - self._emit(value) |
| 27 | + self._emit_single(value) |
67 | 28 |
|
| 29 | + def emit_lazy(self, func: Callable[[], _S]) -> None: |
| 30 | + self._emit_single_lazy(func) |
68 | 31 |
|
69 | | -class BiEvent(Generic[_S, _T], _BaseEvent[Observer | ValueObserver[_S] | BiObserver[_S, _T]], BiObservable[_S, _T], BiEmitter[_S, _T]): |
| 32 | + |
| 33 | +class BiEvent(Generic[_S, _T], _BaseObservable[Observer | ValueObserver[_S] | BiObserver[_S, _T]], BiObservable[_S, _T], BiEmitter[_S, _T]): |
70 | 34 | def _get_parameter_count(self) -> int: |
71 | 35 | return 2 |
72 | 36 |
|
73 | 37 | def __call__(self, value_0: _S, value_1: _T) -> None: |
74 | | - self._emit(value_0, value_1) |
| 38 | + self._emit_n((value_0, value_1)) |
75 | 39 |
|
76 | 40 |
|
77 | | -class TriEvent(Generic[_S, _T, _U], _BaseEvent[Observer | ValueObserver[_S] | BiObserver[_S, _T] | TriObserver[_S, _T, _U]], TriObservable[_S, _T, _U], TriEmitter[_S, _T, _U]): |
| 41 | +class TriEvent(Generic[_S, _T, _U], |
| 42 | + _BaseObservable[Observer | ValueObserver[_S] | BiObserver[_S, _T] | TriObserver[_S, _T, _U]], |
| 43 | + TriObservable[_S, _T, _U], |
| 44 | + TriEmitter[_S, _T, _U]): |
78 | 45 | def _get_parameter_count(self) -> int: |
79 | 46 | return 3 |
80 | 47 |
|
81 | 48 | def __call__(self, value_0: _S, value_1: _T, value_2: _U) -> None: |
82 | | - self._emit(value_0, value_1, value_2) |
| 49 | + self._emit_n((value_0, value_1, value_2)) |
| 50 | + |
| 51 | + |
| 52 | +class ValuesEvent(Generic[_S], _BaseValuesObservable[Observer | ValuesObserver[_S]], ValuesObservable[_S], ValuesEmitter[_S]): |
| 53 | + def __call__(self, value: Iterable[_S]) -> None: |
| 54 | + self._emit_single(value) |
| 55 | + |
| 56 | + def emit_single(self, value: _S) -> None: |
| 57 | + self._emit_single((value,)) |
| 58 | + |
| 59 | + def emit_lazy(self, func: Callable[[], Sequence[_S]]) -> None: |
| 60 | + self._emit_single_lazy(func) |
0 commit comments