diff options
author | crupest <crupest@outlook.com> | 2024-11-11 01:12:29 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2024-12-18 18:31:27 +0800 |
commit | aaa855e3839130a79193f38969f07763f2773c5d (patch) | |
tree | e4cb238df4588f4633d9c1190136895865d51a98 /tools/cru-py/cru/_util/_event.py | |
parent | 95da3ade5bfa6ef39923cd3fc2a551ad983c1537 (diff) | |
download | crupest-aaa855e3839130a79193f38969f07763f2773c5d.tar.gz crupest-aaa855e3839130a79193f38969f07763f2773c5d.tar.bz2 crupest-aaa855e3839130a79193f38969f07763f2773c5d.zip |
HALF WORK: 2024.11.27
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: ) |