diff options
Diffstat (limited to 'async_await.lua')
-rw-r--r-- | async_await.lua | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/async_await.lua b/async_await.lua new file mode 100644 index 0000000..97d4f7d --- /dev/null +++ b/async_await.lua @@ -0,0 +1,43 @@ +lua_async.async_await = {} + +function lua_async.resume(co) + local status, err = coroutine.resume(co) + + if coroutine.status(co) == "dead" or err then + lua_async.limiting.unset_limit(co) + end + + if not status then + error("Error (in async function): " .. err) + end +end + +function await(promise) + local co = assert(coroutine.running(), "await called outside of an async function") + + if promise.state == "pending" then + promise:then_(function() + lua_async.resume(co) + end) + + coroutine.yield() + end + + return unpack(promise.values) +end + +function async(func) + return function(...) + local promise = Promise() + promise.__on_resolve = func + + local args = {...} + + lua_async.resume(coroutine.create(function() + promise:resolve(unpack(args)) + end)) + + return promise + end +end + |