big refactoring
This commit is contained in:
+25
-25
@@ -1,17 +1,17 @@
|
||||
aux.module 'control'
|
||||
|
||||
event_frame = CreateFrame('Frame')
|
||||
event_frame = CreateFrame 'Frame'
|
||||
listeners = {}
|
||||
threads = {}
|
||||
public.thread_id = nil
|
||||
|
||||
function m.LOAD()
|
||||
m.event_frame:SetScript('OnUpdate', m.UPDATE)
|
||||
m.event_frame:SetScript('OnEvent', m.EVENT)
|
||||
function LOAD()
|
||||
event_frame:SetScript('OnUpdate', UPDATE)
|
||||
event_frame:SetScript('OnEvent', EVENT)
|
||||
end
|
||||
|
||||
function EVENT()
|
||||
for _, listener in m.listeners do
|
||||
for _, listener in listeners do
|
||||
if event == listener.event and not listener.killed then
|
||||
listener.cb(listener.kill)
|
||||
end
|
||||
@@ -19,22 +19,22 @@ function EVENT()
|
||||
end
|
||||
|
||||
function UPDATE()
|
||||
for _, listener in m.listeners do
|
||||
if not any(m.listeners, function(l) return not l.killed and l.event == listener.event end) then
|
||||
m.event_frame:UnregisterEvent(listener.event)
|
||||
for _, listener in listeners do
|
||||
if not any(listeners, function(l) return not l.killed and l.event == listener.event end) then
|
||||
event_frame:UnregisterEvent(listener.event)
|
||||
end
|
||||
end
|
||||
|
||||
m.listeners = filter(m.listeners, function(l) return not l.killed end)
|
||||
m.threads = filter(m.threads, function(th) return not th.killed end)
|
||||
listeners = filter(listeners, function(l) return not l.killed end)
|
||||
threads = filter(threads, function(th) return not th.killed end)
|
||||
|
||||
for thread_id, thread in m.threads do
|
||||
for id, thread in threads do
|
||||
if not thread.killed then
|
||||
local k = thread.k
|
||||
thread.k = nil
|
||||
m.thread_id = thread_id
|
||||
thread_id = id
|
||||
k()
|
||||
m.thread_id = nil
|
||||
thread_id = nil
|
||||
if not thread.k then
|
||||
thread.killed = true
|
||||
end
|
||||
@@ -44,49 +44,49 @@ end
|
||||
|
||||
do
|
||||
local id = 0
|
||||
function m.id()
|
||||
function accessor.id()
|
||||
id = id + 1
|
||||
return id
|
||||
end
|
||||
end
|
||||
|
||||
function public.kill_listener(listener_id)
|
||||
for _, listener in {m.listeners[listener_id]} do
|
||||
for _, listener in {listeners[listener_id]} do
|
||||
listener.killed = true
|
||||
end
|
||||
end
|
||||
|
||||
function public.kill_thread(thread_id)
|
||||
for _, thread in {m.threads[thread_id]} do
|
||||
for _, thread in {threads[thread_id]} do
|
||||
thread.killed = true
|
||||
end
|
||||
end
|
||||
|
||||
function public.event_listener(event, cb)
|
||||
local listener_id = m.id()
|
||||
m.listeners[listener_id] = {event=event, cb=cb, kill=function(...) if arg.n == 0 or arg[1] then m.kill_listener(listener_id) end end}
|
||||
m.event_frame:RegisterEvent(event)
|
||||
local listener_id = id
|
||||
listeners[listener_id] = {event=event, cb=cb, kill=function(...) if arg.n == 0 or arg[1] then kill_listener(listener_id) end end}
|
||||
event_frame:RegisterEvent(event)
|
||||
return listener_id
|
||||
end
|
||||
|
||||
function public.on_next_event(event, callback)
|
||||
m.event_listener(event, function(kill)
|
||||
event_listener(event, function(kill)
|
||||
callback()
|
||||
kill()
|
||||
end)
|
||||
end
|
||||
|
||||
function public.thread(k, ...)
|
||||
local thread_id = m.id()
|
||||
m.threads[thread_id] = {k = aux.C(k, unpack(arg))}
|
||||
local thread_id = id
|
||||
threads[thread_id] = {k = L(k, unpack(arg))}
|
||||
return thread_id
|
||||
end
|
||||
|
||||
function public.wait(k, ...)
|
||||
if type(k) == 'number' then
|
||||
m.when(function() k = k - 1 return k <= 1 end, unpack(arg))
|
||||
when(function() k = k - 1 return k <= 1 end, unpack(arg))
|
||||
else
|
||||
m.threads[m.thread_id].k = aux.C(k, unpack(arg))
|
||||
threads[thread_id].k = L(k, unpack(arg))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -94,6 +94,6 @@ function public.when(p, k, ...)
|
||||
if p() then
|
||||
return k(unpack(arg))
|
||||
else
|
||||
return m.wait(m.when, p, aux.C(k, unpack(arg)))
|
||||
return wait(when, p, L(k, unpack(arg)))
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user