diff options
Diffstat (limited to 'tools/cru-py/cru/util/_event.py')
-rw-r--r-- | tools/cru-py/cru/util/_event.py | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/tools/cru-py/cru/util/_event.py b/tools/cru-py/cru/util/_event.py new file mode 100644 index 0000000..813e33f --- /dev/null +++ b/tools/cru-py/cru/util/_event.py @@ -0,0 +1,41 @@ +from typing import ParamSpec, TypeVar, Callable + +from ._list import CruInplaceList, CruList + +P = ParamSpec('P') +R = TypeVar('R') +F = Callable[P, R] + + +class EventHandlerToken: + def __init__(self, event: "Event", handler: F, once: bool = False) -> None: + self._event = event + self._handler = handler + self._once = once + + @property + def event(self) -> "Event": + return self._event + + @property + def handler(self) -> F: + return self._handler + + @property + def once(self) -> bool: + return self._once + + +class Event: + def __init__(self, name: str) -> None: + self._name = name + self._tokens: CruInplaceList[EventHandlerToken] = CruInplaceList() + + def register(self, handler: F, 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: ) |