Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- thread = require("thread")
- class Promise
- new: (async) =>
- @result = {}
- @rejectedHandlers = {}
- @fulfilledHandlers = {}
- @state = "pending"
- handlersCache = 0
- @resolve = (a) =>
- @result = a
- handlers = @fulfilledHandlers
- for i = handlersCache+1, #handlers
- handlersCache = i
- if type(@result) == "table" and @result.__class == @@
- result = @result\await()
- if @result.state == "rejected"
- @reject(@result)
- return
- @result = result
- res = {pcall(handlers[i],@result)}
- success = table.remove(res,1)
- @result = res[1]
- if not success
- @reject(@result)
- return
- @state = "fulfilled"
- @reject = (a) =>
- @result = a
- handlers = @rejectedHandlers
- for i = handlersCache+1, #handlers
- handlersCache = i
- res = {pcall(handlers[i],@result)}
- success = table.remove(res,1)
- @result = res[1]
- if success then
- @resolve(@result)
- return
- @state = "rejected"
- @thread = thread.create(() ->
- resolve = (...) ->
- if @state == "pending"
- @resolve(...)
- reject = (...) ->
- if @state == "pending"
- @reject(...)
- success, reason = pcall(async,resolve,reject)
- if not success
- @reject(reason)
- )
- next: (onResolve,onReject) =>
- table.insert(@fulfilledHandlers,onResolve)
- if @state =="fulfilled"
- @resolve(@result)
- if not onReject
- onReject = (e) -> error(e)
- table.insert(@rejectedHandlers,onReject)
- return @
- catch: (onReject) =>
- table.insert(@rejectedHandlers,onReject)
- if @state == "rejected"
- @reject(@result)
- table.insert(@fulfilledHandlers,(a)->return a)
- return @
- await: () =>
- thread.waitForAny({@thread})
- return @result
- Promise.all = (list) ->
- return Promise((resolve, reject) ->
- values = {}
- while true
- os.sleep(0.1)
- isFulfilled = true
- for i = 1, #list
- prom = list[i]
- if prom.state == "pending"
- isFulfilled = false
- elseif prom.state == "rejected"
- reject(prom.result)
- elseif prom.state == "fulfilled"
- table.remove(list,i)
- promResult = prom.result
- table.insert(values,promResult)
- if isFulfilled
- resolve(values)
- )
- Promise.race = (list) ->
- for i = 1, #list
- if not (type(list[i]) == "table" and list[i].__class and list[i].__class.__name == "Promise")
- list[i] = Promise.resolve(list[i])
- return Promise((resolve,reject) ->
- while true do
- os.sleep(0.1)
- for i = 1, #list
- prom = list[i]
- if prom.state ~= "pending"
- if prom.state == "rejected"
- reject(prom.result)
- elseif prom.state == "fulfilled"
- resolve(prom.result)
- )
- Promise.resolve = (value) ->
- return Promise((a,b) ->
- a(value)
- )
- Promise.reject = (reason) ->
- return Promise((a,b)->
- b(reason)
- )
- return Promise
RAW Paste Data