more control flow utils

This commit is contained in:
Simon Hirsig
2015-10-02 11:38:07 +02:00
parent dea974ac39
commit 712bd9bcc3
+107 -50
View File
@@ -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
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