]> git.lizzy.rs Git - lua_async.git/blob - async_await.lua
Add source code
[lua_async.git] / async_await.lua
1 lua_async.async_await = {}
2
3 function lua_async.resume(co)
4         local status, err = coroutine.resume(co)
5
6         if coroutine.status(co) == "dead" or err then
7                 lua_async.limiting.unset_limit(co)
8         end
9
10         if not status then
11                 error("Error (in async function): " .. err)
12         end
13 end
14
15 function await(promise)
16         local co = assert(coroutine.running(), "await called outside of an async function")
17
18         if promise.state == "pending" then
19                 promise:then_(function()
20                         lua_async.resume(co)
21                 end)
22
23                 coroutine.yield()
24         end
25
26         return unpack(promise.values)
27 end
28
29 function async(func)
30         return function(...)
31                 local promise = Promise()
32                 promise.__on_resolve = func
33
34                 local args = {...}
35
36                 lua_async.resume(coroutine.create(function()
37                         promise:resolve(unpack(args))
38                 end))
39
40                 return promise
41         end
42 end
43