2019-01-08 18:10:22 +11:00
|
|
|
local event = {}
|
2019-07-14 20:52:56 +10:00
|
|
|
function event.pull(t,...) -- return an event, optionally with timeout *t* and filter *...*.
|
2019-01-08 18:10:22 +11:00
|
|
|
local tA = {...}
|
|
|
|
if type(t) == "string" then
|
|
|
|
table.insert(tA,1,t)
|
|
|
|
t = 0
|
|
|
|
end
|
|
|
|
if not t or t <= 0 then
|
|
|
|
t = math.huge
|
|
|
|
end
|
|
|
|
local tE = computer.uptime()+t
|
|
|
|
repeat
|
|
|
|
tEv = {coroutine.yield()}
|
|
|
|
local ret = true
|
|
|
|
for i = 1, #tA do
|
2019-11-26 18:50:36 +11:00
|
|
|
if type(tEv[i]) == "string" and type(tA[i]) == "string" then
|
|
|
|
if not (tEv[i] or ""):match(tA[i]) then
|
|
|
|
ret = false
|
|
|
|
end
|
|
|
|
else
|
|
|
|
ret = tEv[i] == tA[i]
|
2019-01-08 18:10:22 +11:00
|
|
|
end
|
|
|
|
end
|
|
|
|
if ret then return table.unpack(tEv) end
|
|
|
|
until computer.uptime() > tE
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
2019-07-14 20:52:56 +10:00
|
|
|
function event.listen(e,f) -- run function *f* for every occurance of event *e*
|
2019-01-08 18:10:22 +11:00
|
|
|
os.spawn(function() while true do
|
|
|
|
local tEv = {coroutine.yield()}
|
|
|
|
if tEv[1] == e then
|
|
|
|
f(table.unpack(tEv))
|
|
|
|
end
|
2019-11-09 16:09:23 +11:00
|
|
|
if not os.taskInfo(os.taskInfo().parent) or (tEv[1] == "unlisten" and tEv[2] == e and tEv[3] == tostring(f)) then break end
|
|
|
|
end end,string.format("[%d] %s listener",os.pid(),e))
|
2019-01-08 18:10:22 +11:00
|
|
|
end
|
|
|
|
|
2019-07-14 20:52:56 +10:00
|
|
|
function event.ignore(e,f) -- stop function *f* running for every occurance of event *e*
|
2019-01-08 18:10:22 +11:00
|
|
|
computer.pushSignal("unlisten",e,tostring(f))
|
|
|
|
end
|
|
|
|
|
|
|
|
return event
|