aboutsummaryrefslogtreecommitdiffstats
path: root/old_base.moon
diff options
context:
space:
mode:
Diffstat (limited to 'old_base.moon')
-rw-r--r--old_base.moon70
1 files changed, 70 insertions, 0 deletions
diff --git a/old_base.moon b/old_base.moon
new file mode 100644
index 0000000..950ea16
--- /dev/null
+++ b/old_base.moon
@@ -0,0 +1,70 @@
+DISP, OP, OUT = {}, {}, {}
+
+class Value
+ new: (@value) =>
+
+ __tostring: => "<value: #{@value}>"
+
+class Dispatcher
+ new: =>
+ @operators = {}
+
+ dispatch: (...) =>
+ for op in pairs @operators
+ op\dispatch ...
+ op\update!
+
+ register: (op, params=true) =>
+ @operators[op] = params
+
+ unregister: (op) =>
+ @operators[op] = nil
+
+class Op
+ new: (opts={}, defaults) =>
+ assert defaults, "OP-def needs default arguments"
+ for k,v in pairs defaults
+ @[k] = opts[k] or v
+
+ @parents = 0
+ @setup!
+
+ setup: =>
+ destroy: =>
+ update: => -- return current value (pure)
+
+ mount: (lastval) =>
+ @parents += 1
+
+ if lastval and @parents == 1
+ @setup lastval
+
+ unmount: =>
+ @parents -= 1
+ if @parents == 0
+ @destroy!
+
+class Out
+ new: (@handle) =>
+ @values = {}
+ @mapping = {}
+
+ __call: (key, op) =>
+ if @mapping[key]
+ @mapping[key]\unmount!
+
+ @mapping[key] = op
+ @mapping[key]\mount @values[key]
+
+ update: =>
+ for key, op in pairs @mapping
+ @values[key] = op\update!
+
+ @handle! if @handle
+
+{
+ :Value,
+ :DISP, :Dispatcher
+ :OP, :Op
+ :OUT, :Out
+}