aboutsummaryrefslogtreecommitdiff
path: root/tools/cru-py/cru/_event.py
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2024-11-11 01:12:29 +0800
committerYuqian Yang <crupest@crupest.life>2024-12-18 18:31:27 +0800
commit7fbc091ae8ed2a4bac215ee04d7c4b5d0218af4e (patch)
treece5a6b3dc74a012766c6d09e7e97cf8eba25ff9e /tools/cru-py/cru/_event.py
parentaaa855e3839130a79193f38969f07763f2773c5d (diff)
downloadcrupest-7fbc091ae8ed2a4bac215ee04d7c4b5d0218af4e.tar.gz
crupest-7fbc091ae8ed2a4bac215ee04d7c4b5d0218af4e.tar.bz2
crupest-7fbc091ae8ed2a4bac215ee04d7c4b5d0218af4e.zip
HALF WORK: 2024.11.28
Diffstat (limited to 'tools/cru-py/cru/_event.py')
-rw-r--r--tools/cru-py/cru/_event.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/tools/cru-py/cru/_event.py b/tools/cru-py/cru/_event.py
new file mode 100644
index 0000000..ee914f0
--- /dev/null
+++ b/tools/cru-py/cru/_event.py
@@ -0,0 +1,41 @@
+from typing import ParamSpec, TypeVar, Callable
+
+from ._iter 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: )