summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2023-03-26 21:15:51 -0500
committerthe lemons <citrons@mondecitronne.com>2023-03-26 21:18:31 -0500
commitfca17d72effb43e9d094f12b52fe46086872b4d2 (patch)
treed164e5ae7db253fdedd62c861f338c11e9687825
parenta6ff8a6d17892e61511f710e1eac5d3a6741618d (diff)
add optional timeout to evloop.poll
-rw-r--r--evloop.lua24
1 files changed, 15 insertions, 9 deletions
diff --git a/evloop.lua b/evloop.lua
index 6c12c3a..dec8bd1 100644
--- a/evloop.lua
+++ b/evloop.lua
@@ -14,16 +14,22 @@ local function resume_task(task, e)
goto resume
end
end
+ if e[1] == "update" and
+ task.timeout and love.timer.getTime() >= task.timeout then
+ e = {}
+ goto resume
+ end
return true
end
::resume::
- local ok, ret = coroutine.resume(task.co, e)
+ local ok, ret, timeout = coroutine.resume(task.co, e)
if not ok then
io.stderr:write(debug.traceback(task.co, ret)..'\n\n')
error "error in event loop"
end
task.filter = ret
+ task.timeout = timeout and love.timer.getTime() + timeout
return coroutine.status(task.co) ~= "dead"
end
@@ -34,18 +40,18 @@ local function create_task(fn)
return task
end
-function M.poll(...)
+function M.poll(timeout, ...)
local filter = {...}
- return unpack(coroutine.yield(#filter > 0 and filter))
+ if type(timeout) == "string" then
+ table.insert(filter, timeout)
+ timeout = nil
+ end
+ return unpack(
+ coroutine.yield((timeout or #filter > 0) and filter, timeout))
end
function M.sleep(secs)
- local t = 0
- while t < secs do
- local e, dt = M.poll "update"
- t = t + dt
- end
- return t
+ M.poll(secs)
end
function M.queue(...)