From 712bd9bcc32e46262aab650cda4f82a1d5ad8382 Mon Sep 17 00:00:00 2001 From: Simon Hirsig Date: Fri, 2 Oct 2015 11:38:07 +0200 Subject: [PATCH 1/2] more control flow utils --- control.lua | 157 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 107 insertions(+), 50 deletions(-) diff --git a/control.lua b/control.lua index b45c0f4..468a1f0 100644 --- a/control.lua +++ b/control.lua @@ -1,61 +1,118 @@ Aux.control = {} -local events = {} - local event_listeners = {} local update_listeners = {} -function Aux.util.controller() - local ready, continuation - return { - - } -end - -function Aux.util.event_listener(event, action) - return { - start = function() - tinsert(events, f) - end, - stop = function() - Aux.util.remove(events, f) +function Aux.control.on_event() + for listener, _ in pairs(event_listeners) do + if event == listener.event then + listener.action() end - - - } -end - - - - - - - -function Aux.control.onevent() - -end - - -function Aux.control.onupdate() - - - - - - - - - - -local listen_for_event(listener) - tinsert(event_listeners, listener) - return function() - Aux.util.remove(event_listeners, listener) end end -function wait_for_event(event) - return function +function Aux.control.on_update() + for listener, _ in pairs(update_listeners) do + listener.action() + end +end -end \ No newline at end of file +function Aux.control.event_listener(event, action) + local listener = { event=event, action=action } + local self = {} + + function self:set_action(self, action) + listener.action = action + end + + function self:start(self) + Aux.util.set_add(event_listeners, listener) + if not Aux.util.any(event_listeners, function(l) l.event == event end then + AuxControlFrame:RegisterEvent(event) + end + return self + end + + function self:stop(self) + Aux.util.set_remove(event_listeners, listener) + if not Aux.util.any(event_listeners, function(l) l.event == event end then + AuxControlFrame:UnregisterEvent(event) + end + return self + end + + return self +end + +function Aux.control.update_listener(action) + local listener = { action=action } + + local self = {} + + function self:set_action(self, action) + listener.action = action + end + + function self:start(self) + Aux.util.set_add(update_listeners, listener) + return self + end + + function self:stop(self) + Aux.util.set_remove(update_listeners, listener) + return self + end + + return self +end + +function Aux.control.on_next_event(event, action) + local listener = Aux.control.event_listener(event) + listener.set_action(function() + listener.stop() + action() + end + listener.start() +end + +function Aux.control.on_next_update(action) + local listener = Aux.control.update_listener() + listener.set_action(function() + listener.stop() + action() + end + listener.start() +end + +function Aux.control.controller() + local state + local self = {} + + local listener = Aux.control.update_listener(function() + if state then + local continue, continuation = state.continue, state.continuation + if continue() then + state = nil + continuation() + end + end + end)() + + function self:cleanup(self) + listener.stop() + end + + function self:wait(self, p, k) + state = { + continuation = k + continue = p + } + end + + function self:wait_for_event(self, event, k) + self:wait(function() + end + + return self +end From 89f3a6737faa600bbbe24f56b5cb7d9b687e3ae1 Mon Sep 17 00:00:00 2001 From: Simon Hirsig Date: Fri, 2 Oct 2015 13:12:59 +0200 Subject: [PATCH 2/2] control improvements --- control.lua | 96 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/control.lua b/control.lua index 468a1f0..2916c5a 100644 --- a/control.lua +++ b/control.lua @@ -18,10 +18,13 @@ function Aux.control.on_update() end end -function Aux.control.event_listener(event, action) - local listener = { event=event, action=action } + + +function Aux.control.event_listener(event, action) -- async! local self = {} + local listener = { event=event, action=action } + function self:set_action(self, action) listener.action = action end @@ -46,9 +49,9 @@ function Aux.control.event_listener(event, action) end function Aux.control.update_listener(action) - local listener = { action=action } - local self = {} + + local listener = { action=action } function self:set_action(self, action) listener.action = action @@ -67,52 +70,67 @@ function Aux.control.update_listener(action) return self end -function Aux.control.on_next_event(event, action) - local listener = Aux.control.event_listener(event) - listener.set_action(function() - listener.stop() - action() - end - listener.start() -end -function Aux.control.on_next_update(action) + +function Aux.control.on_next_update(callback) local listener = Aux.control.update_listener() - listener.set_action(function() - listener.stop() - action() + + listener:set_action(function() + listener:stop() + callback() end - listener.start() + + listener:start() end -function Aux.control.controller() - local state +function Aux.control.as_soon_as(p, callback) + local listener = Aux.control.update_listener() + + listener:set_action(function() + if p() then + callback() + listener:stop() + end + end) + + listener:start() +end + +function Aux.control.on_next_event(event, callback) + local ok + + local listener = Aux.control.event_listener(event) + + listener:set_action(function() + listener:stop() + ok = true + end + + listener:start() + + Aux.control.as_soon_as(function() return ok end, callback) +end + + + +function Aux.control.timer() local self = {} - local listener = Aux.control.update_listener(function() - if state then - local continue, continuation = state.continue, state.continuation - if continue() then - state = nil - continuation() - end - end - end)() + local t_0 - function self:cleanup(self) - listener.stop() + function self:start(self) + t_0 = GetTime() end - function self:wait(self, p, k) - state = { - continuation = k - continue = p - } - end - - function self:wait_for_event(self, event, k) - self:wait(function() + function self:after(self, t, callback) + Aux.util.as_soon_as(function() return t_0 and GetTime() - t_0 > t end, callback) end return self end + +function Aux.control.after_time(t, callback) + local timer = Aux.control.timer() + timer:start() + timer:after(t, callback) +end