diff options
Diffstat (limited to 'tools/cru-py/cru/_event.py')
-rw-r--r-- | tools/cru-py/cru/_event.py | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/tools/cru-py/cru/_event.py b/tools/cru-py/cru/_event.py index ee914f0..65265fd 100644 --- a/tools/cru-py/cru/_event.py +++ b/tools/cru-py/cru/_event.py @@ -1,24 +1,28 @@ -from typing import ParamSpec, TypeVar, Callable +from __future__ import annotations -from ._iter import CruInplaceList, CruList +from collections.abc import Callable +from typing import Generic, ParamSpec, TypeVar -P = ParamSpec('P') -R = TypeVar('R') -F = Callable[P, R] +from ._list import CruList +_P = ParamSpec("_P") +_R = TypeVar("_R") -class EventHandlerToken: - def __init__(self, event: "Event", handler: F, once: bool = False) -> None: + +class EventHandlerToken(Generic[_P, _R]): + def __init__( + self, event: Event, handler: Callable[_P, _R], once: bool = False + ) -> None: self._event = event self._handler = handler self._once = once @property - def event(self) -> "Event": + def event(self) -> Event: return self._event @property - def handler(self) -> F: + def handler(self) -> Callable[_P, _R]: return self._handler @property @@ -26,16 +30,32 @@ class EventHandlerToken: return self._once -class Event: +class Event(Generic[_P, _R]): def __init__(self, name: str) -> None: self._name = name - self._tokens: CruInplaceList[EventHandlerToken] = CruInplaceList() + self._tokens: CruList[EventHandlerToken] = CruList() - def register(self, handler: F, once: bool = False) -> EventHandlerToken: + def register( + self, handler: Callable[_P, _R], once: bool = False + ) -> EventHandlerToken: token = EventHandlerToken(self, handler, once) self._tokens.append(token) return token - def unregister(self, *h: EventHandlerToken | F) -> int: - - self._tokens.find_all_indices_if(lambda t: ) + def unregister(self, *handlers: EventHandlerToken | Callable[_P, _R]) -> int: + old_length = len(self._tokens) + self._tokens.reset( + self._tokens.as_cru_iterator().filter( + (lambda t: t in handlers or t.handler in handlers) + ) + ) + return old_length - len(self._tokens) + + def trigger(self, *args: _P.args, **kwargs: _P.kwargs) -> CruList[_R]: + results = CruList( + self._tokens.as_cru_iterator() + .transform(lambda t: t.handler(*args, **kwargs)) + .to_list() + ) + self._tokens.reset(self._tokens.as_cru_iterator().filter(lambda t: not t.once)) + return results |