aboutsummaryrefslogtreecommitdiff
path: root/src_py/hatter/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'src_py/hatter/util.py')
-rw-r--r--src_py/hatter/util.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/src_py/hatter/util.py b/src_py/hatter/util.py
index 5d23751..a4fff55 100644
--- a/src_py/hatter/util.py
+++ b/src_py/hatter/util.py
@@ -103,3 +103,45 @@ def monkeypatch_sqlite3():
return val
sqlite3.register_converter("timestamp", _sqlite_convert_timestamp)
+
+
+class RegisterCallbackHandle(collections.namedtuple(
+ 'RegisterCallbackHandle', ['cancel'])):
+ """Handle used for canceling callback registration
+
+ Attributes:
+ cancel (Callable[[],None]): cancel registered callback
+
+ """
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.cancel()
+
+
+class CallbackRegistry:
+ """Callback registry"""
+
+ def __init__(self):
+ self._cbs = []
+
+ def register(self, cb):
+ """Register callback
+
+ Args:
+ cb (Callable): callback
+
+ Returns:
+ RegisterCallbackHandle
+
+ """
+ self.cbs.append(cb)
+ return RegisterCallbackHandle(lambda: self.cbs.remove(cb))
+
+ def notify(self, *args, **kwargs):
+ """Notify all registered callbacks"""
+
+ for cb in self._cbs:
+ cb(*args, **kwargs)