Guest User

Untitled

a guest
Jan 29th, 2017
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.87 KB | None | 0 0
  1. local PromiseState = {
  2. pending = "pending",
  3. fulfilled = "fulfilled",
  4. rejected = "rejected"
  5. }
  6.  
  7. local Promise
  8.  
  9. local PROMISE = {}
  10. PROMISE.__index = PROMISE
  11.  
  12. function PROMISE:__tostring()
  13. if self._state == PromiseState.pending then
  14. return "Promise (pending)"
  15. elseif self._state == PromiseState.fulfilled then
  16. return ("Promise (fulfilled, value=%s)"):format(tostring(self._value))
  17. elseif self._state == PromiseState.rejected then
  18. return ("Promise (rejected, reason=%s)"):format(tostring(self._reason))
  19. end
  20. end
  21.  
  22. local function TriggerPromiseReactions(reactions, argument)
  23. for _, reaction in ipairs(reactions) do
  24. local status, val = pcall(reaction.handler, argument)
  25. if status then
  26. reaction.capabilities.resolve(val)
  27. else
  28. reaction.capabilities.reject(val)
  29. end
  30. end
  31. end
  32.  
  33. function PROMISE:then_(on_fulfilled, on_rejected)
  34. local new_promise_resolve, new_promise_reject
  35. local new_promise = Promise(function(res, rej)
  36. new_promise_resolve, new_promise_reject = res, rej
  37. end)
  38.  
  39. local result_capability = {
  40. promise = new_promise,
  41. resolve = new_promise_resolve,
  42. reject = new_promise_reject
  43. }
  44.  
  45. on_fulfilled = on_fulfilled or function(x) return x end
  46. on_rejected = on_rejected or function(x) error(x) end
  47.  
  48. local fulfill_reaction = {
  49. capabilities = result_capability,
  50. handler = on_fulfilled
  51. }
  52.  
  53. local reject_reaction = {
  54. capabilities = result_capability,
  55. handler = on_rejected
  56. }
  57.  
  58. if self._state == PromiseState.pending then
  59. self._fulfill_reactions[#self._fulfill_reactions + 1] = fulfill_reaction
  60. self._reject_reactions[#self._reject_reactions + 1] = reject_reaction
  61. elseif self._state == PromiseState.fulfilled then
  62. TriggerPromiseReactions({ fulfill_reaction }, self._value)
  63. elseif self._state == PromiseState.rejected then
  64. TriggerPromiseReactions({ reject_reaction }, self._reason)
  65. end
  66.  
  67. return result_capability.promise
  68. end
  69.  
  70. function PROMISE:theen_(on_fulfilled, on_rejected)
  71. local new_promise_resolve, new_promise_reject
  72. local new_promise = Promise(function(res, rej)
  73. new_promise_resolve, new_promise_reject = res, rej
  74. end)
  75.  
  76. local result_capability = {
  77. promise = new_promise,
  78. resolve = new_promise_resolve,
  79. reject = new_promise_reject
  80. }
  81.  
  82. on_fulfilled = on_fulfilled or function(x) return x end
  83. on_rejected = on_rejected or function(x) error(x) end
  84.  
  85. local fulfill_reaction = {
  86. capabilities = result_capability,
  87. handler = on_fulfilled
  88. }
  89.  
  90. local reject_reaction = {
  91. capabilities = result_capability,
  92. handler = on_rejected
  93. }
  94.  
  95. if self._state == PromiseState.pending then
  96. self._fulfill_reactions[#self._fulfill_reactions + 1] = fulfill_reaction
  97. self._reject_reactions[#self._reject_reactions + 1] = reject_reaction
  98. elseif self._state == PromiseState.fulfilled then
  99. TriggerPromiseReactions({ fulfill_reaction }, self._value)
  100. elseif self._state == PromiseState.rejected then
  101. TriggerPromiseReactions({ reject_reaction }, self._reason)
  102. end
  103.  
  104. return result_capability.promise
  105. end
  106.  
  107. function PROMISE:catch(on_rejected)
  108. self:then_(nil, on_rejected)
  109. end
  110.  
  111. function PROMISE:_fulfill(val)
  112. if self._state ~= PromiseState.pending then return end
  113.  
  114. self._value = val
  115.  
  116. TriggerPromiseReactions(self._fulfill_reactions, self._reason)
  117.  
  118. self._fulfill_reactions = nil
  119. self._reject_reactions = nil
  120.  
  121. self._state = PromiseState.fulfilled
  122. end
  123.  
  124. function PROMISE:_reject(val)
  125. if self._state ~= PromiseState.pending then return end
  126.  
  127. self._reason = val
  128.  
  129. TriggerPromiseReactions(self._reject_reactions, self._reason)
  130.  
  131. self._fulfill_reactions = nil
  132. self._reject_reactions = nil
  133.  
  134. self._state = PromiseState.rejected
  135. end
  136.  
  137. local function CreateResolvingFunctions(promise)
  138. local already_resolved = false
  139.  
  140. local resolve, reject
  141.  
  142. resolve = function(resolution)
  143. if already_resolved then return end
  144. already_resolved = true
  145.  
  146. if resolution == promise then
  147. return promise:_reject("selfResolutionError")
  148. end
  149.  
  150. if getmetatable(resolution) == PROMISE then
  151. local resolve2, reject2 = CreateResolvingFunctions(promise)
  152. local success, val = pcall(resolution.then_, resolution, resolve2, reject2)
  153. if not success then
  154. return reject2(val)
  155. end
  156. else
  157. return promise:_fulfill(resolution)
  158. end
  159. end
  160.  
  161. reject = function(reason)
  162. if already_resolved then return end
  163. already_resolved = true
  164. return promise:_reject(reason)
  165. end
  166.  
  167. return resolve, reject
  168. end
  169.  
  170. Promise = setmetatable({}, {
  171. __call = function(_, executor)
  172. local promise = setmetatable({
  173. _state = PromiseState.pending,
  174. _fulfill_reactions = {},
  175. _reject_reactions = {}
  176. }, PROMISE)
  177.  
  178. local resolve, reject = CreateResolvingFunctions(promise)
  179.  
  180. local success, val = pcall(executor, resolve, reject)
  181.  
  182. if not success then
  183. reject(val)
  184. end
  185.  
  186. return promise
  187. end
  188. })
  189.  
  190. function Promise.reject(reason)
  191. return Promise(function(resolve, reject)
  192. reject(reason)
  193. end)
  194. end
  195.  
  196. function Promise.resolve(val)
  197. return Promise(function(resolve, reject)
  198. resolve(val)
  199. end)
  200. end
  201.  
  202. function Promise.all()
  203. end
  204.  
  205. function Promise.race()
  206. end
  207.  
  208. return Promise
Advertisement
Add Comment
Please, Sign In to add comment