aboutsummaryrefslogtreecommitdiff
path: root/tools/cru-py/cru/_util/_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
commitaaa855e3839130a79193f38969f07763f2773c5d (patch)
treee4cb238df4588f4633d9c1190136895865d51a98 /tools/cru-py/cru/_util/_event.py
parent95da3ade5bfa6ef39923cd3fc2a551ad983c1537 (diff)
downloadcrupest-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.py41
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: )