aboutsummaryrefslogtreecommitdiff
path: root/tools/cru-py/cru/_util/_event.py
diff options
context:
space:
mode:
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: )