@@ -27,7 +27,7 @@ function PackedValue.first(self)
27
27
return first
28
28
end
29
29
30
- --- @class Promise
30
+ --- @class Promise
31
31
local Promise = {}
32
32
Promise .__index = Promise
33
33
@@ -73,14 +73,25 @@ local new_pending = function(on_fullfilled, on_rejected)
73
73
end
74
74
75
75
--- Equivalents to JavaScript's Promise.new.
76
- --- @param executor function : ` (resolve : function (... ) , reject : function (... )) `
77
- --- @return table : Promise
76
+ --- @param executor fun ( resolve : fun ( ... : any ), reject : fun ( ... : any ))
77
+ --- @return Promise
78
78
function Promise .new (executor )
79
79
vim .validate ({ executor = { executor , ' function' } })
80
80
81
81
local self = new_pending ()
82
82
83
83
local resolve = function (...)
84
+ local first = ...
85
+ if is_promise (first ) then
86
+ first
87
+ :next (function (...)
88
+ self :_resolve (... )
89
+ end )
90
+ :catch (function (...)
91
+ self :_reject (... )
92
+ end )
93
+ return
94
+ end
84
95
self :_resolve (... )
85
96
end
86
97
local reject = function (...)
93
104
94
105
--- Returns a fulfilled promise.
95
106
--- But if the first argument is promise, returns the promise.
96
- --- @vararg any : one promise or non-promises
97
- --- @return table : Promise
107
+ --- @param ... any : one promise or non-promises
108
+ --- @return Promise
98
109
function Promise .resolve (...)
99
110
local first = ...
100
111
if is_promise (first ) then
108
119
109
120
--- Returns a rejected promise.
110
121
--- But if the first argument is promise, returns the promise.
111
- --- @vararg any : one promise or non-promises
112
- --- @return table : Promise
122
+ --- @param ... any : one promise or non-promises
123
+ --- @return Promise
113
124
function Promise .reject (...)
114
125
local first = ...
115
126
if is_promise (first ) then
@@ -201,9 +212,9 @@ function Promise._start_reject(self, value)
201
212
end
202
213
203
214
--- Equivalents to JavaScript's Promise.then.
204
- --- @param on_fullfilled function | nil : A callback on fullfilled.
205
- --- @param on_rejected function | nil : A callback on rejected.
206
- --- @return table : Promise
215
+ --- @param on_fullfilled ( fun ( ... : any ): any )? : A callback on fullfilled.
216
+ --- @param on_rejected ( fun ( ... : any ): any )? : A callback on rejected.
217
+ --- @return Promise
207
218
function Promise .next (self , on_fullfilled , on_rejected )
208
219
vim .validate ({
209
220
on_fullfilled = { on_fullfilled , ' function' , true },
@@ -223,15 +234,15 @@ function Promise.next(self, on_fullfilled, on_rejected)
223
234
end
224
235
225
236
--- Equivalents to JavaScript's Promise.catch.
226
- --- @param on_rejected function | nil : A callback on rejected.
227
- --- @return table : Promise
237
+ --- @param on_rejected ( fun ( ... : any ): any )? : A callback on rejected.
238
+ --- @return Promise
228
239
function Promise .catch (self , on_rejected )
229
240
return self :next (nil , on_rejected )
230
241
end
231
242
232
243
--- Equivalents to JavaScript's Promise.finally.
233
- --- @param on_finally function
234
- --- @return table : Promise
244
+ --- @param on_finally fun ()
245
+ --- @return Promise
235
246
function Promise .finally (self , on_finally )
236
247
vim .validate ({ on_finally = { on_finally , ' function' , true } })
237
248
return self
247
258
248
259
--- Equivalents to JavaScript's Promise.all.
249
260
--- Even if multiple value are resolved, results include only the first value.
250
- --- @param list table : promise or non-promise values
251
- --- @return table : Promise
261
+ --- @param list any[] : promise or non-promise values
262
+ --- @return Promise
252
263
function Promise .all (list )
253
264
vim .validate ({ list = { list , ' table' } })
254
265
return Promise .new (function (resolve , reject )
@@ -276,8 +287,8 @@ function Promise.all(list)
276
287
end
277
288
278
289
--- Equivalents to JavaScript's Promise.race.
279
- --- @param list table : promise or non-promise values
280
- --- @return table : Promise
290
+ --- @param list any[] : promise or non-promise values
291
+ --- @return Promise
281
292
function Promise .race (list )
282
293
vim .validate ({ list = { list , ' table' } })
283
294
return Promise .new (function (resolve , reject )
295
306
296
307
--- Equivalents to JavaScript's Promise.any.
297
308
--- Even if multiple value are rejected, errors include only the first value.
298
- --- @param list table : promise or non-promise values
299
- --- @return table : Promise
309
+ --- @param list any[] : promise or non-promise values
310
+ --- @return Promise
300
311
function Promise .any (list )
301
312
vim .validate ({ list = { list , ' table' } })
302
313
return Promise .new (function (resolve , reject )
325
336
326
337
--- Equivalents to JavaScript's Promise.allSettled.
327
338
--- Even if multiple value are resolved/rejected, value/reason is only the first value.
328
- --- @param list table : promise or non-promise values
329
- --- @return table : Promise
339
+ --- @param list any[] : promise or non-promise values
340
+ --- @return Promise
330
341
function Promise .all_settled (list )
331
342
vim .validate ({ list = { list , ' table' } })
332
343
return Promise .new (function (resolve )
0 commit comments