@oscarpalmer/atoms 0.193.0 → 0.194.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/dist/array/difference.mjs +2 -2
  2. package/dist/array/intersection.mjs +2 -2
  3. package/dist/array/match.mjs +13 -13
  4. package/dist/array/slice.mjs +5 -5
  5. package/dist/array/sort.d.mts +5 -1
  6. package/dist/array/sort.mjs +4 -2
  7. package/dist/array/union.mjs +2 -2
  8. package/dist/beacon.d.mts +8 -1
  9. package/dist/beacon.mjs +52 -60
  10. package/dist/color/constants.d.mts +1 -1
  11. package/dist/color/constants.mjs +3 -5
  12. package/dist/color/instance.mjs +34 -41
  13. package/dist/color/misc/format.d.mts +3 -2
  14. package/dist/color/misc/format.mjs +4 -1
  15. package/dist/color/misc/is.d.mts +9 -1
  16. package/dist/color/misc/is.mjs +11 -1
  17. package/dist/color/misc/state.d.mts +6 -6
  18. package/dist/color/misc/state.mjs +11 -14
  19. package/dist/color/models.d.mts +23 -68
  20. package/dist/function/assert.mjs +2 -2
  21. package/dist/function/limit.d.mts +0 -6
  22. package/dist/function/limit.mjs +2 -2
  23. package/dist/function/memoize.mjs +19 -32
  24. package/dist/function/once.d.mts +0 -3
  25. package/dist/function/once.mjs +16 -13
  26. package/dist/function/retry.d.mts +1 -24
  27. package/dist/function/retry.mjs +1 -1
  28. package/dist/function/work.mjs +13 -11
  29. package/dist/herald.d.mts +30 -31
  30. package/dist/herald.mjs +74 -56
  31. package/dist/index.d.mts +100 -185
  32. package/dist/index.mjs +680 -702
  33. package/dist/internal/abort.d.mts +10 -0
  34. package/dist/internal/abort.mjs +14 -0
  35. package/dist/internal/array/chunk.mjs +2 -2
  36. package/dist/internal/array/find.mjs +2 -2
  37. package/dist/internal/array/sets.d.mts +4 -4
  38. package/dist/internal/array/sets.mjs +7 -7
  39. package/dist/internal/function/timer.mjs +19 -15
  40. package/dist/internal/number.mjs +7 -7
  41. package/dist/internal/result.mjs +3 -3
  42. package/dist/internal/sized.mjs +4 -4
  43. package/dist/internal/string.mjs +4 -4
  44. package/dist/internal/subscription.d.mts +24 -8
  45. package/dist/internal/subscription.mjs +49 -36
  46. package/dist/internal/value/equal.mjs +6 -6
  47. package/dist/internal/value/misc.mjs +14 -14
  48. package/dist/internal/value/set.mjs +2 -2
  49. package/dist/logger.mjs +15 -39
  50. package/dist/promise/constants.d.mts +17 -0
  51. package/dist/promise/constants.mjs +14 -0
  52. package/dist/promise/delay.mjs +7 -10
  53. package/dist/promise/helpers.mjs +1 -1
  54. package/dist/promise/index.mjs +14 -17
  55. package/dist/promise/misc.d.mts +2 -1
  56. package/dist/promise/misc.mjs +8 -7
  57. package/dist/promise/models.d.mts +4 -16
  58. package/dist/promise/models.mjs +4 -13
  59. package/dist/promise/timed.mjs +9 -10
  60. package/dist/query.mjs +15 -15
  61. package/dist/queue.mjs +103 -116
  62. package/dist/random.mjs +7 -7
  63. package/dist/result/index.d.mts +0 -3
  64. package/dist/result/index.mjs +1 -1
  65. package/dist/result/match.d.mts +0 -3
  66. package/dist/result/match.mjs +4 -4
  67. package/dist/result/misc.mjs +2 -2
  68. package/dist/result/work/flow.d.mts +0 -3
  69. package/dist/result/work/flow.mjs +5 -5
  70. package/dist/result/work/pipe.d.mts +0 -3
  71. package/dist/result/work/pipe.mjs +3 -3
  72. package/dist/string/case.mjs +20 -20
  73. package/dist/string/fuzzy.mjs +23 -18
  74. package/dist/string/index.mjs +7 -7
  75. package/dist/string/normalize.mjs +14 -14
  76. package/dist/string/template.mjs +2 -2
  77. package/dist/value/clone.mjs +10 -10
  78. package/dist/value/smush.mjs +2 -2
  79. package/package.json +13 -5
  80. package/src/array/difference.ts +0 -73
  81. package/src/array/exists.ts +0 -93
  82. package/src/array/filter.ts +0 -182
  83. package/src/array/find.ts +0 -183
  84. package/src/array/first.ts +0 -196
  85. package/src/array/flatten.ts +0 -20
  86. package/src/array/from.ts +0 -129
  87. package/src/array/get.ts +0 -131
  88. package/src/array/group-by.ts +0 -369
  89. package/src/array/index.ts +0 -26
  90. package/src/array/insert.ts +0 -52
  91. package/src/array/intersection.ts +0 -72
  92. package/src/array/last.ts +0 -194
  93. package/src/array/match.ts +0 -436
  94. package/src/array/move.ts +0 -315
  95. package/src/array/partition.ts +0 -91
  96. package/src/array/push.ts +0 -23
  97. package/src/array/reverse.ts +0 -33
  98. package/src/array/select.ts +0 -260
  99. package/src/array/single.ts +0 -93
  100. package/src/array/slice.ts +0 -335
  101. package/src/array/sort.ts +0 -607
  102. package/src/array/splice.ts +0 -106
  103. package/src/array/swap.ts +0 -322
  104. package/src/array/to-map.ts +0 -371
  105. package/src/array/to-record.ts +0 -351
  106. package/src/array/to-set.ts +0 -80
  107. package/src/array/toggle.ts +0 -79
  108. package/src/array/union.ts +0 -72
  109. package/src/array/unique.ts +0 -67
  110. package/src/array/update.ts +0 -75
  111. package/src/beacon.ts +0 -378
  112. package/src/color/constants.ts +0 -137
  113. package/src/color/index.ts +0 -83
  114. package/src/color/instance.ts +0 -162
  115. package/src/color/misc/alpha.ts +0 -56
  116. package/src/color/misc/format.ts +0 -29
  117. package/src/color/misc/get.ts +0 -210
  118. package/src/color/misc/is.ts +0 -221
  119. package/src/color/misc/state.ts +0 -243
  120. package/src/color/models.ts +0 -389
  121. package/src/color/space/hex.ts +0 -184
  122. package/src/color/space/hsl.ts +0 -174
  123. package/src/color/space/hwb.ts +0 -153
  124. package/src/color/space/rgb.ts +0 -240
  125. package/src/function/assert.ts +0 -174
  126. package/src/function/index.ts +0 -2
  127. package/src/function/limit.ts +0 -83
  128. package/src/function/memoize.ts +0 -202
  129. package/src/function/once.ts +0 -200
  130. package/src/function/retry.ts +0 -175
  131. package/src/function/work.ts +0 -1007
  132. package/src/herald.ts +0 -216
  133. package/src/index.ts +0 -68
  134. package/src/internal/array/callbacks.ts +0 -46
  135. package/src/internal/array/chunk.ts +0 -51
  136. package/src/internal/array/compact.ts +0 -56
  137. package/src/internal/array/find.ts +0 -200
  138. package/src/internal/array/group.ts +0 -42
  139. package/src/internal/array/index-of.ts +0 -182
  140. package/src/internal/array/insert.ts +0 -80
  141. package/src/internal/array/overlap.ts +0 -35
  142. package/src/internal/array/sets.ts +0 -74
  143. package/src/internal/array/shuffle.ts +0 -33
  144. package/src/internal/array/update.ts +0 -52
  145. package/src/internal/function/misc.ts +0 -8
  146. package/src/internal/function/timer.ts +0 -168
  147. package/src/internal/is.ts +0 -244
  148. package/src/internal/math/aggregate.ts +0 -164
  149. package/src/internal/math/misc.ts +0 -28
  150. package/src/internal/number.ts +0 -129
  151. package/src/internal/random.ts +0 -49
  152. package/src/internal/result.ts +0 -92
  153. package/src/internal/sized.ts +0 -25
  154. package/src/internal/string.ts +0 -128
  155. package/src/internal/subscription.ts +0 -264
  156. package/src/internal/value/compare.ts +0 -170
  157. package/src/internal/value/equal.ts +0 -465
  158. package/src/internal/value/get.ts +0 -57
  159. package/src/internal/value/handlers.ts +0 -95
  160. package/src/internal/value/has.ts +0 -118
  161. package/src/internal/value/misc.ts +0 -125
  162. package/src/internal/value/partial.ts +0 -46
  163. package/src/internal/value/set.ts +0 -132
  164. package/src/is.ts +0 -182
  165. package/src/logger.ts +0 -230
  166. package/src/math.ts +0 -281
  167. package/src/models.ts +0 -286
  168. package/src/number.ts +0 -1
  169. package/src/promise/delay.ts +0 -62
  170. package/src/promise/helpers.ts +0 -96
  171. package/src/promise/index.ts +0 -300
  172. package/src/promise/misc.ts +0 -96
  173. package/src/promise/models.ts +0 -195
  174. package/src/promise/timed.ts +0 -91
  175. package/src/query.ts +0 -147
  176. package/src/queue.ts +0 -814
  177. package/src/random.ts +0 -125
  178. package/src/result/index.ts +0 -105
  179. package/src/result/match.ts +0 -124
  180. package/src/result/misc.ts +0 -129
  181. package/src/result/models.ts +0 -83
  182. package/src/result/work/flow.ts +0 -488
  183. package/src/result/work/pipe.ts +0 -496
  184. package/src/sized/map.ts +0 -110
  185. package/src/sized/set.ts +0 -107
  186. package/src/string/case.ts +0 -236
  187. package/src/string/fuzzy.ts +0 -444
  188. package/src/string/index.ts +0 -199
  189. package/src/string/match.ts +0 -80
  190. package/src/string/normalize.ts +0 -205
  191. package/src/string/template.ts +0 -161
  192. package/src/value/clone.ts +0 -319
  193. package/src/value/collection.ts +0 -63
  194. package/src/value/diff.ts +0 -232
  195. package/src/value/freeze.ts +0 -322
  196. package/src/value/handle.ts +0 -3
  197. package/src/value/index.ts +0 -5
  198. package/src/value/merge.ts +0 -278
  199. package/src/value/omit.ts +0 -20
  200. package/src/value/pick.ts +0 -20
  201. package/src/value/shake.ts +0 -45
  202. package/src/value/smush.ts +0 -89
  203. package/src/value/transform.ts +0 -153
  204. package/src/value/unsmush.ts +0 -84
@@ -1,300 +0,0 @@
1
- import type {Result} from '../result/models';
2
- import {getPromiseOptions, getPromisesOptions, getResultsFromPromises} from './helpers';
3
- import {handleResult, settlePromise} from './misc';
4
- import {
5
- PROMISE_ABORT_OPTIONS,
6
- PROMISE_ABORT_EVENT,
7
- PROMISE_MESSAGE_EXPECTATION_ATTEMPT,
8
- PROMISE_STRATEGY_DEFAULT,
9
- PROMISE_TYPE_FULFILLED,
10
- PROMISE_TYPE_REJECTED,
11
- type PromiseData,
12
- type PromiseHandlers,
13
- type PromiseOptions,
14
- type PromisesItems,
15
- type PromisesOptions,
16
- type PromisesResult,
17
- type PromisesValue,
18
- type PromisesValues,
19
- type PromisesUnwrapped,
20
- } from './models';
21
- import {getTimedPromise} from './timed';
22
-
23
- // #region Functions
24
-
25
- /**
26
- * Wrap a _Promise_ with safety handlers, with optional abort capabilities and timeout
27
- *
28
- * @param promise _Promise_ to wrap
29
- * @param options Options for the _Promise_
30
- * @returns Wrapped _Promise_
31
- */
32
- export async function attemptPromise<Value>(
33
- promise: Promise<Value>,
34
- options?: PromiseOptions | AbortSignal | number,
35
- ): Promise<Value>;
36
-
37
- /**
38
- * Wrap a _Promise_-returning callback with safety handlers, with optional abort capabilities and timeout
39
- *
40
- * @param callback Callback to wrap
41
- * @param options Options for the _Promise_
42
- * @returns _Promise_-wrapped callback
43
- */
44
- export async function attemptPromise<Value>(
45
- callback: () => Promise<Value>,
46
- options?: PromiseOptions | AbortSignal | number,
47
- ): Promise<Value>;
48
-
49
- /**
50
- * Wrap a callback with a _Promise_ and safety handlers, with optional abort capabilities and timeout
51
- *
52
- * @param callback Callback to wrap
53
- * @param options Options for the _Promise_
54
- * @returns _Promise_-wrapped callback
55
- */
56
- export async function attemptPromise<Value>(
57
- callback: () => Value,
58
- options?: PromiseOptions | AbortSignal | number,
59
- ): Promise<Value>;
60
-
61
- export async function attemptPromise<Value>(
62
- value: (() => Value) | Promise<Value>,
63
- options?: PromiseOptions | AbortSignal | number,
64
- ): Promise<Value> {
65
- const isFunction = typeof value === 'function';
66
-
67
- if (!isFunction && !(value instanceof Promise)) {
68
- return Promise.reject(new TypeError(PROMISE_MESSAGE_EXPECTATION_ATTEMPT));
69
- }
70
-
71
- const {signal, time} = getPromiseOptions(options);
72
-
73
- if (signal?.aborted ?? false) {
74
- return Promise.reject(signal!.reason);
75
- }
76
-
77
- function abort(): void {
78
- rejector(signal!.reason);
79
- }
80
-
81
- async function handler(
82
- resolve: (value: Value) => void,
83
- reject: (reason: unknown) => void,
84
- ): Promise<void> {
85
- try {
86
- let result = isFunction ? value() : await value;
87
-
88
- if (result instanceof Promise) {
89
- result = await result;
90
- }
91
-
92
- settlePromise(abort, resolve, result, signal);
93
- } catch (error) {
94
- settlePromise(abort, reject, error, signal);
95
- }
96
- }
97
-
98
- let rejector: (reason: unknown) => void;
99
-
100
- signal?.addEventListener(PROMISE_ABORT_EVENT, abort, PROMISE_ABORT_OPTIONS);
101
-
102
- const promise = new Promise<Value>((resolve, reject) => {
103
- rejector = reject;
104
-
105
- void handler(resolve, reject);
106
- });
107
-
108
- return time > 0 ? getTimedPromise(promise, time, signal) : promise;
109
- }
110
-
111
- /**
112
- * Handle a list of _Promises_, returning their results in an ordered array
113
- *
114
- * Depending on the strategy, the function will either reject on the first error encountered or return an array of rejected and resolved results
115
- *
116
- * @param items List of _Promises_
117
- * @param options Options for handling the _Promises_
118
- * @returns List of results
119
- */
120
- export async function promises<Items extends unknown[], Options extends PromisesOptions>(
121
- items: [...Items],
122
- options?: Options,
123
- ): Promise<
124
- Options['strategy'] extends 'first'
125
- ? PromisesUnwrapped<Items>
126
- : PromisesValues<PromisesItems<Items>>
127
- >;
128
-
129
- /**
130
- * Handle a list of _Promises_, returning their results in an ordered array
131
- *
132
- * Depending on the strategy, the function will either reject on the first error encountered or return an array of rejected and resolved results
133
- *
134
- * @param items List of _Promises_
135
- * @param options Options for handling the _Promises_
136
- * @returns List of results
137
- */
138
- export async function promises<Value, Options extends PromisesOptions>(
139
- items: Promise<Value>[],
140
- options?: Options,
141
- ): Promise<Options['strategy'] extends 'first' ? Value[] : PromisesValue<Value>[]>;
142
-
143
- /**
144
- * Handle a list of _Promises_, returning their results in an ordered array
145
- *
146
- * If any _Promise_ in the list is rejected, the whole function will reject
147
- *
148
- * @param items List of _Promises_
149
- * @param strategy Strategy for handling the _Promises_; rejects on the first error encountered
150
- * @returns List of results
151
- */
152
- export async function promises<Items extends unknown[]>(
153
- items: [...Items],
154
- strategy: 'first',
155
- ): Promise<PromisesUnwrapped<Items>>;
156
-
157
- /**
158
- * Handle a list of _Promises_, returning their results in an ordered array
159
- *
160
- * If any _Promise_ in the list is rejected, the whole function will reject
161
- *
162
- * @param items List of _Promises_
163
- * @param strategy Strategy for handling the _Promises_; rejects on the first error encountered
164
- * @returns List of results
165
- */
166
- export async function promises<Value>(items: Promise<Value>[], strategy: 'first'): Promise<Value[]>;
167
-
168
- /**
169
- * Handle a list of _Promises_, returning their results in an ordered array of rejected and resolved results
170
- *
171
- * @param items List of _Promises_
172
- * @param signal AbortSignal for aborting the operation _(when aborted, the _Promise_ will reject with the reason of the signal)_
173
- * @returns List of results
174
- */
175
- export async function promises<Items extends unknown[]>(
176
- items: [...Items],
177
- signal?: AbortSignal,
178
- ): Promise<PromisesValues<PromisesItems<Items>>>;
179
-
180
- /**
181
- * Handle a list of _Promises_, returning their results in an ordered array of rejected and resolved results
182
- *
183
- * @param items List of _Promises_
184
- * @param signal AbortSignal for aborting the operation _(when aborted, the _Promise_ will reject with the reason of the signal)_
185
- * @returns List of results
186
- */
187
- export async function promises<Value>(
188
- items: Array<Promise<Value> | (() => Promise<Value>)>,
189
- signal?: AbortSignal,
190
- ): Promise<PromisesValue<Value>[]>;
191
-
192
- export async function promises(items: unknown[], options?: unknown): Promise<unknown[]> {
193
- const {signal, strategy} = getPromisesOptions(options);
194
-
195
- if (signal?.aborted ?? false) {
196
- return Promise.reject(signal!.reason);
197
- }
198
-
199
- if (!Array.isArray(items)) {
200
- return Promise.resolve([]);
201
- }
202
-
203
- const actual = items
204
- .map(item => (typeof item === 'function' ? item() : item))
205
- .filter(item => item instanceof Promise);
206
-
207
- const {length} = actual;
208
-
209
- if (length === 0) {
210
- return Promise.resolve([]);
211
- }
212
-
213
- const complete = strategy === PROMISE_STRATEGY_DEFAULT;
214
-
215
- function abort(): void {
216
- handlers.reject(signal!.reason);
217
- }
218
-
219
- signal?.addEventListener(PROMISE_ABORT_EVENT, abort, PROMISE_ABORT_OPTIONS);
220
-
221
- const data: PromiseData = {
222
- last: length - 1,
223
- result: [] as unknown[],
224
- };
225
-
226
- let handlers: PromiseHandlers;
227
-
228
- return new Promise((resolve, reject) => {
229
- handlers = {reject, resolve};
230
-
231
- for (let index = 0; index < length; index += 1) {
232
- void actual[index]
233
- .then(value =>
234
- handleResult(PROMISE_TYPE_FULFILLED, {
235
- abort,
236
- complete,
237
- data,
238
- handlers,
239
- index,
240
- signal,
241
- value,
242
- }),
243
- )
244
- .catch(reason =>
245
- handleResult(PROMISE_TYPE_REJECTED, {
246
- abort,
247
- complete,
248
- data,
249
- handlers,
250
- index,
251
- signal,
252
- value: reason,
253
- }),
254
- );
255
- }
256
- });
257
- }
258
-
259
- promises.result = resultPromises;
260
-
261
- /**
262
- * Handle a list of _Promises_, returning their results in an ordered array of results _({@link Result})_
263
- *
264
- * Depending on the strategy, the function will either reject on the first error encountered or return an array of rejected and resolved results
265
- *
266
- * _Available as `resultPromises` and `promises.result`_
267
- *
268
- * @param items List of _Promises_
269
- * @param signal AbortSignal for aborting the operation _(when aborted, the _Promise_ will reject with the reason of the signal)_
270
- * @returns List of results
271
- */
272
- export async function resultPromises<Items extends unknown[]>(
273
- items: [...Items],
274
- signal?: AbortSignal,
275
- ): Promise<PromisesResult<PromisesItems<Items>>>;
276
-
277
- /**
278
- * Handle a list of _Promises_, returning their results in an ordered array of results _({@link Result})_
279
- *
280
- * Depending on the strategy, the function will either reject on the first error encountered or return an array of rejected and resolved results
281
- *
282
- * _Available as `resultPromises` and `promises.result`_
283
- *
284
- * @param items List of _Promises_
285
- * @param signal AbortSignal for aborting the operation _(when aborted, the _Promise_ will reject with the reason of the signal)_
286
- * @returns List of results
287
- */
288
- export async function resultPromises<Value>(
289
- items: Promise<Value>[],
290
- signal?: AbortSignal,
291
- ): Promise<Result<Awaited<Value>>[]>;
292
-
293
- export async function resultPromises(
294
- items: Promise<unknown>[],
295
- signal?: AbortSignal,
296
- ): Promise<Result<unknown>[]> {
297
- return promises(items, signal).then(getResultsFromPromises);
298
- }
299
-
300
- // #endregion
@@ -1,96 +0,0 @@
1
- import {error, ok} from '../result/misc';
2
- import type {Result} from '../result/models';
3
- import {
4
- CancelablePromise,
5
- PROMISE_ABORT_EVENT,
6
- PROMISE_MESSAGE_EXPECTATION_RESULT,
7
- PROMISE_TYPE_FULFILLED,
8
- PROMISE_TYPE_REJECTED,
9
- type PromiseParameters,
10
- } from './models';
11
-
12
- // #region Functions
13
-
14
- /**
15
- * Create a cancelable _Promise_
16
- *
17
- * @param executor Executor function for the _Promise_
18
- * @returns Cancelable _Promise_
19
- */
20
- export function cancelable<Value>(
21
- executor: (resolve: (value: Value) => void, reject: (reason: unknown) => void) => void,
22
- ): CancelablePromise<Value> {
23
- return new CancelablePromise(executor);
24
- }
25
-
26
- export function handleResult(status: string, parameters: PromiseParameters): void {
27
- const {abort, complete, data, handlers, index, signal, value} = parameters;
28
-
29
- if (signal?.aborted ?? false) {
30
- return;
31
- }
32
-
33
- if (!complete && status === PROMISE_TYPE_REJECTED) {
34
- settlePromise(abort, handlers.reject, value, signal);
35
-
36
- return;
37
- }
38
-
39
- (data.result as unknown[])[index] = !complete
40
- ? value
41
- : status === PROMISE_TYPE_FULFILLED
42
- ? {status, value}
43
- : {status, reason: value};
44
-
45
- if (index === data.last) {
46
- settlePromise(abort, handlers.resolve, data.result, signal);
47
- }
48
- }
49
-
50
- export function settlePromise(
51
- aborter: () => void,
52
- settler: (value: any) => void,
53
- value: unknown,
54
- signal?: AbortSignal,
55
- ): void {
56
- signal?.removeEventListener(PROMISE_ABORT_EVENT, aborter);
57
-
58
- settler(value);
59
- }
60
-
61
- /**
62
- * Converts a _Promise_ to a promised result
63
- *
64
- * @param callback _Promise_ callback
65
- * @returns Promised result
66
- */
67
- export async function toResult<Value>(callback: () => Promise<Value>): Promise<Result<Value>>;
68
-
69
- /**
70
- * Converts a _Promise_ to a promised result
71
- *
72
- * @param promise _Promise_ to convert
73
- * @returns Promised result
74
- */
75
- export async function toResult<Value>(promise: Promise<Value>): Promise<Result<Value>>;
76
-
77
- export async function toResult<Value>(
78
- value: Promise<Value> | (() => Promise<Value>),
79
- ): Promise<Result<Value>> {
80
- const actual = typeof value === 'function' ? value() : value;
81
-
82
- if (!(actual instanceof Promise)) {
83
- return Promise.reject(new TypeError(PROMISE_MESSAGE_EXPECTATION_RESULT));
84
- }
85
-
86
- return actual.then(result => ok(result)).catch(reason => error(reason));
87
- }
88
-
89
- // #endregion
90
-
91
- // #region Exports
92
-
93
- export {toPromise as fromResult} from '../result/misc';
94
- export {isFulfilled, isRejected} from './helpers';
95
-
96
- // #endregion
@@ -1,195 +0,0 @@
1
- import type {GenericCallback} from '../models';
2
- import type {Result} from '../result/models';
3
-
4
- // #region Types
5
-
6
- /**
7
- * A _Promise_ that can be canceled
8
- */
9
- export class CancelablePromise<Value = void> extends Promise<Value> {
10
- #rejector!: (reason: unknown) => void;
11
-
12
- constructor(
13
- executor: (resolve: (value: Value) => void, reject: (reason: unknown) => void) => void,
14
- ) {
15
- let rejector: (reason: unknown) => void;
16
-
17
- super((resolve, reject) => {
18
- rejector = reject;
19
-
20
- executor(resolve, reject);
21
- });
22
-
23
- this.#rejector = rejector!;
24
- }
25
-
26
- /**
27
- * Cancel the _Promise_, rejecting it with an optional reason
28
- *
29
- * @param reason Optional reason for canceling the _Promise_
30
- */
31
- cancel(reason?: unknown): void {
32
- this.#rejector(reason);
33
- }
34
- }
35
-
36
- /**
37
- * A _Promise_ that was fulfilled
38
- */
39
- export type FulfilledPromise<Value> = {
40
- /**
41
- * Status of the _Promise_
42
- */
43
- status: typeof PROMISE_TYPE_FULFILLED;
44
- /**
45
- * Value of the _Promise_
46
- */
47
- value: Awaited<Value>;
48
- };
49
-
50
- export type PromiseData = {
51
- last: number;
52
- result: unknown[];
53
- };
54
-
55
- export type PromiseHandlers = {
56
- resolve: (value: unknown[]) => void;
57
- reject: (reason: unknown) => void;
58
- };
59
-
60
- /**
61
- * Options for a _Promise_-handling function
62
- */
63
- export type PromiseOptions = {
64
- /**
65
- * AbortSignal for aborting the _Promise_; when aborted, the _Promise_ will reject with the reason of the signal
66
- */
67
- signal?: AbortSignal;
68
- /**
69
- * How long to wait for _(in milliseconds; defaults to `0`)_
70
- */
71
- time?: number;
72
- };
73
-
74
- export type PromiseParameters = {
75
- abort: () => void;
76
- complete: boolean;
77
- data: PromiseData;
78
- handlers: PromiseHandlers;
79
- index: number;
80
- signal?: AbortSignal;
81
- value?: unknown;
82
- };
83
-
84
- /**
85
- * _Promise_ handling strategy
86
- *
87
- * - `complete`: wait for all _Promises_ to settle, then return the results, as an array of fulfilled and/or rejected results
88
- * - `first`: rejects on the first rejected _Promise_, and returns an array of values
89
- */
90
- export type PromiseStrategy = 'complete' | 'first';
91
-
92
- /**
93
- * An error thrown when a promise times out
94
- */
95
- export class PromiseTimeoutError extends Error {
96
- constructor() {
97
- super(PROMISE_MESSAGE_TIMEOUT);
98
-
99
- this.name = PROMISE_ERROR_NAME;
100
- }
101
- }
102
-
103
- export type PromisesItems<Items extends unknown[]> = {
104
- [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback
105
- ? ReturnType<Items[ItemsKey]> extends Promise<infer Value>
106
- ? Promise<Value>
107
- : never
108
- : Items[ItemsKey] extends Promise<infer Value>
109
- ? Promise<Value>
110
- : Promise<Items[ItemsKey]>;
111
- };
112
-
113
- /**
114
- * Options for handling multiple _Promises_
115
- */
116
- export type PromisesOptions = {
117
- /**
118
- * AbortSignal for aborting the _Promises_; when aborted, the _Promises_ will reject with the reason of the signal
119
- */
120
- signal?: AbortSignal;
121
- /**
122
- * Strategy for handling the _Promises_; defaults to `complete`
123
- */
124
- strategy?: PromiseStrategy;
125
- };
126
-
127
- export type PromisesResult<Items extends unknown[]> = {
128
- [ItemsKey in keyof Items]: Items[ItemsKey] extends Promise<infer Value>
129
- ? Result<Awaited<Value>>
130
- : never;
131
- };
132
-
133
- export type PromisesUnwrapped<Items extends unknown[]> = {
134
- [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback
135
- ? ReturnType<Items[ItemsKey]> extends Promise<infer Value>
136
- ? Awaited<Value>
137
- : never
138
- : Items[ItemsKey] extends Promise<infer Value>
139
- ? Awaited<Value>
140
- : never;
141
- };
142
-
143
- export type PromisesValue<Value> = FulfilledPromise<Value> | RejectedPromise;
144
-
145
- export type PromisesValues<Items extends unknown[]> = {
146
- [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback
147
- ? ReturnType<Items[ItemsKey]> extends Promise<infer Value>
148
- ? PromisesValue<Awaited<Value>>
149
- : never
150
- : Items[ItemsKey] extends Promise<infer Value>
151
- ? PromisesValue<Awaited<Value>>
152
- : never;
153
- };
154
-
155
- /**
156
- * A _Promise_ that was rejected
157
- */
158
- export type RejectedPromise = {
159
- /**
160
- * Status of the _Promise_
161
- */
162
- status: typeof PROMISE_TYPE_REJECTED;
163
- /**
164
- * Reason for the rejection
165
- */
166
- reason: unknown;
167
- };
168
-
169
- // #endregion
170
-
171
- // #region Variables
172
-
173
- export const PROMISE_ABORT_EVENT = 'abort';
174
-
175
- export const PROMISE_ABORT_OPTIONS = {once: true};
176
-
177
- export const PROMISE_ERROR_NAME = 'PromiseTimeoutError';
178
-
179
- export const PROMISE_MESSAGE_EXPECTATION_ATTEMPT = 'Attempt expected a function or a promise';
180
-
181
- export const PROMISE_MESSAGE_EXPECTATION_RESULT = 'toResult expected a Promise';
182
-
183
- export const PROMISE_MESSAGE_EXPECTATION_TIMED = 'Timed function expected a Promise';
184
-
185
- export const PROMISE_MESSAGE_TIMEOUT = 'Promise timed out';
186
-
187
- export const PROMISE_STRATEGY_ALL = new Set<PromiseStrategy>(['complete', 'first']);
188
-
189
- export const PROMISE_STRATEGY_DEFAULT: PromiseStrategy = 'complete';
190
-
191
- export const PROMISE_TYPE_FULFILLED = 'fulfilled';
192
-
193
- export const PROMISE_TYPE_REJECTED = 'rejected';
194
-
195
- // #endregion
@@ -1,91 +0,0 @@
1
- import {getTimer, TIMER_WAIT} from '../internal/function/timer';
2
- import type {RequiredKeys} from '../models';
3
- import {getPromiseOptions} from './helpers';
4
- import {settlePromise} from './misc';
5
- import {
6
- PROMISE_ABORT_OPTIONS,
7
- PROMISE_ABORT_EVENT,
8
- PROMISE_MESSAGE_EXPECTATION_TIMED,
9
- PromiseTimeoutError,
10
- type PromiseOptions,
11
- } from './models';
12
-
13
- // #region Functions
14
-
15
- export async function getTimedPromise<Value>(
16
- promise: Promise<Value>,
17
- time: number,
18
- signal?: AbortSignal,
19
- ): Promise<Value> {
20
- function abort(): void {
21
- timer.cancel();
22
-
23
- rejector(signal!.reason);
24
- }
25
-
26
- signal?.addEventListener(PROMISE_ABORT_EVENT, abort, PROMISE_ABORT_OPTIONS);
27
-
28
- const timer = getTimer(
29
- TIMER_WAIT,
30
- () => {
31
- settlePromise(abort, rejector, new PromiseTimeoutError(), signal);
32
- },
33
- time,
34
- );
35
-
36
- let rejector: (reason: unknown) => void;
37
-
38
- return Promise.race<Value>([
39
- promise,
40
- new Promise((_, reject) => {
41
- rejector = reject;
42
-
43
- timer();
44
- }),
45
- ]).then(value => {
46
- timer.cancel();
47
-
48
- rejector(undefined);
49
-
50
- signal?.removeEventListener(PROMISE_ABORT_EVENT, abort);
51
-
52
- return value;
53
- });
54
- }
55
-
56
- /**
57
- * Create a _Promise_ that should be settled within a certain amount of time
58
- *
59
- * @param promise _Promise_ to settle
60
- * @param options Timed options
61
- * @returns Timed _Promise_
62
- */
63
- export async function timed<Value>(
64
- promise: Promise<Value>,
65
- options: RequiredKeys<PromiseOptions, 'time'>,
66
- ): Promise<Value>;
67
-
68
- /**
69
- * Create a _Promise_ that should be settled within a certain amount of time
70
- *
71
- * @param promise _Promise_ to settle
72
- * @param time How long to wait for _(in milliseconds; defaults to `0`)_
73
- * @returns Timed _Promise_
74
- */
75
- export async function timed<Value>(promise: Promise<Value>, time: number): Promise<Value>;
76
-
77
- export async function timed<Value>(promise: Promise<Value>, options: unknown): Promise<Value> {
78
- if (!(promise instanceof Promise)) {
79
- return Promise.reject(new TypeError(PROMISE_MESSAGE_EXPECTATION_TIMED));
80
- }
81
-
82
- const {signal, time} = getPromiseOptions(options);
83
-
84
- if (signal?.aborted ?? false) {
85
- return Promise.reject(signal!.reason);
86
- }
87
-
88
- return time > 0 ? getTimedPromise(promise, time, signal) : promise;
89
- }
90
-
91
- // #endregion