summaryrefslogtreecommitdiff
path: root/python/astal/binding.py
diff options
context:
space:
mode:
authorAylur <[email protected]>2024-05-19 02:39:53 +0200
committerAylur <[email protected]>2024-05-19 02:39:53 +0200
commit1425b396b08f0e91d45bbd0f92b1309115c7c870 (patch)
tree8af1a899a14d8a01a9ef50e248c077b48aed25bc /python/astal/binding.py
init 0.1.0
Diffstat (limited to 'python/astal/binding.py')
-rw-r--r--python/astal/binding.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/python/astal/binding.py b/python/astal/binding.py
new file mode 100644
index 0000000..0fe1b6c
--- /dev/null
+++ b/python/astal/binding.py
@@ -0,0 +1,33 @@
+import re
+
+
+def kebabify(string):
+ return re.sub(r"([a-z])([A-Z])", r"\1-\2", string).replace("_", "-").lower()
+
+
+class Binding:
+ def __init__(self, emitter, prop=None):
+ self.emitter = emitter
+ self.prop = kebabify(prop) if prop else None
+ self.transform_fn = lambda v: v
+
+ def __str__(self):
+ return f"Binding<{self.emitter}{', ' + self.prop if self.prop else ''}>"
+
+ def as_(self, fn):
+ bind = Binding(self.emitter, self.prop)
+ bind.transform_fn = lambda v: fn(self.transform_fn(v))
+ return bind
+
+ def get(self):
+ if hasattr(self.emitter, "get") and callable(self.emitter.get):
+ return self.transform_fn(self.emitter.get())
+
+ return self.transform_fn(self.emitter[f"get_{self.prop}"]())
+
+ def subscribe(self, callback):
+ if hasattr(self.emitter, "subscribe") and callable(self.emitter.subscribe):
+ return self.emitter.subscribe(lambda _: callback(self.get()))
+
+ i = self.emitter.connect(f"notify::{self.prop}", lambda: callback(self.get()))
+ return lambda: self.emitter.disconnect(i)