Files
TurtleMail/control.lua
T
Manuel Simon Hirsig 495d1e3a71 fixed small bug
2015-10-10 13:16:11 +02:00

148 lines
2.6 KiB
Lua

Postal.control = {}
local event_listeners = {}
local update_listeners = {}
function Postal.control.on_event()
for listener, _ in pairs(event_listeners) do
if event == listener.event and not listener.deleted then
listener.action()
end
end
end
function Postal.control.on_update()
event_listeners = Postal.util.set_filter(event_listeners, function(l) return not l.deleted end)
update_listeners = Postal.util.set_filter(update_listeners, function(l) return not l.deleted end)
for listener, _ in pairs(update_listeners) do
if not listener.deleted then
listener.action()
end
end
end
function Postal.control.event_listener(event, action)
local self = {}
local listener = { event=event, action=action }
function self.set_action(action)
listener.action = action
end
function self.start()
Postal.util.set_add(event_listeners, listener)
if not Postal.util.any(event_listeners, function(l) return l.event == event end) then
PostalControlFrame:RegisterEvent(event)
end
return self
end
function self.stop()
listener.deleted = true
if not Postal.util.any(event_listeners, function(l) return l.event == event end) then
PostalControlFrame:UnregisterEvent(event)
end
return self
end
return self
end
function Postal.control.update_listener(action)
local self = {}
local listener = { action=action }
function self.set_action(action)
listener.action = action
end
function self.start()
Postal.util.set_add(update_listeners, listener)
return self
end
function self.stop()
listener.deleted = true
return self
end
return self
end
function Postal.control.on_next_update(callback)
local listener = Postal.control.update_listener()
listener.set_action(function()
listener:stop()
return callback()
end)
listener.start()
end
function Postal.control.on_next_event(event, callback)
local listener = Postal.control.event_listener(event)
listener.set_action(function()
listener:stop()
return callback()
end)
listener.start()
end
function Postal.control.as_soon_as(p, callback)
local listener = Postal.control.update_listener()
listener.set_action(function()
if p() then
listener.stop()
return callback()
end
end)
listener.start()
end
function Postal.control.controller()
local self = {}
local state
local listener = Postal.control.update_listener()
listener.set_action(function()
if state and state.p() then
local k = state.k
state = nil
return k()
end
end)
listener.start()
function self.wait(p, k)
state = {
k = k,
p = p,
}
end
function self.reset()
state = nil
end
function self.cleanup()
listener.stop()
end
return self
end