@oscarpalmer/atoms 0.149.0 → 0.150.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.
- package/dist/atoms.full.js +172 -142
- package/dist/index.js +9 -3
- package/dist/promise/delay.js +28 -0
- package/dist/promise/helpers.js +51 -0
- package/dist/promise/index.js +73 -0
- package/dist/promise/misc.js +36 -0
- package/dist/promise/models.js +37 -0
- package/dist/promise/timed.js +33 -0
- package/dist/result/index.js +4 -27
- package/dist/result/misc.js +40 -0
- package/package.json +3 -3
- package/src/index.ts +1 -1
- package/src/promise/delay.ts +63 -0
- package/src/promise/helpers.ts +91 -0
- package/src/promise/index.ts +230 -0
- package/src/promise/misc.ts +89 -0
- package/src/promise/models.ts +131 -0
- package/src/promise/timed.ts +90 -0
- package/src/result/index.ts +4 -66
- package/src/result/misc.ts +115 -0
- package/types/index.d.ts +1 -1
- package/types/promise/delay.d.ts +13 -0
- package/types/promise/helpers.d.ts +17 -0
- package/types/promise/index.d.ts +53 -0
- package/types/promise/misc.d.ts +22 -0
- package/types/promise/models.d.ts +81 -0
- package/types/promise/timed.d.ts +17 -0
- package/types/result/index.d.ts +3 -34
- package/types/result/misc.d.ts +51 -0
- package/dist/promise.js +0 -221
- package/src/promise.ts +0 -538
- package/types/promise.d.ts +0 -139
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AnyResult, Err, ExtendedErr, Ok, Result } from './models';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an extended error result
|
|
4
|
+
* @param error Error value
|
|
5
|
+
* @param original Original error
|
|
6
|
+
* @returns Error result
|
|
7
|
+
*/
|
|
8
|
+
export declare function error<E>(value: E, original: Error): ExtendedErr<E>;
|
|
9
|
+
/**
|
|
10
|
+
* Creates an error result
|
|
11
|
+
* @param error Error value
|
|
12
|
+
* @returns Error result
|
|
13
|
+
*/
|
|
14
|
+
export declare function error<E>(value: E): Err<E>;
|
|
15
|
+
export declare function getError<E>(value: E, original?: Error): Err<E> | ExtendedErr<E>;
|
|
16
|
+
/**
|
|
17
|
+
* Creates an ok result
|
|
18
|
+
* @param value Value
|
|
19
|
+
* @returns Ok result
|
|
20
|
+
*/
|
|
21
|
+
export declare function ok<Value>(value: Value): Ok<Value>;
|
|
22
|
+
/**
|
|
23
|
+
* Converts a result to a promise
|
|
24
|
+
*
|
|
25
|
+
* Resolves if ok, rejects for error
|
|
26
|
+
* @param result Result to convert
|
|
27
|
+
* @returns Promised result
|
|
28
|
+
*/
|
|
29
|
+
export declare function toPromise<Value, E = Error>(callback: () => AnyResult<Value, E>): Promise<Value>;
|
|
30
|
+
/**
|
|
31
|
+
* Converts a result to a promise
|
|
32
|
+
*
|
|
33
|
+
* Resolves if ok, rejects for error
|
|
34
|
+
* @param result Result to convert
|
|
35
|
+
* @returns Promised result
|
|
36
|
+
*/
|
|
37
|
+
export declare function toPromise<Value, E = Error>(result: AnyResult<Value, E>): Promise<Value>;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the value of an ok result _(or a default value)_
|
|
40
|
+
* @param value Result to unwrap
|
|
41
|
+
* @param defaultValue Default value
|
|
42
|
+
* @returns Value of the result _(or the default value)_
|
|
43
|
+
*/
|
|
44
|
+
export declare function unwrap<Value, E = Error>(value: Result<Value, E>, defaultValue: Value): Value;
|
|
45
|
+
/**
|
|
46
|
+
* Gets the value of an ok result _(or a default value)_
|
|
47
|
+
* @param value Result to unwrap
|
|
48
|
+
* @param defaultValue Default value
|
|
49
|
+
* @returns Value of the result _(or the default value)_
|
|
50
|
+
*/
|
|
51
|
+
export declare function unwrap(value: unknown, defaultValue: unknown): unknown;
|
package/dist/promise.js
DELETED
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
var CancelablePromise = class extends Promise {
|
|
2
|
-
#rejector;
|
|
3
|
-
constructor(executor) {
|
|
4
|
-
let rejector;
|
|
5
|
-
super((resolve, reject) => {
|
|
6
|
-
rejector = reject;
|
|
7
|
-
executor(resolve, reject);
|
|
8
|
-
});
|
|
9
|
-
this.#rejector = rejector;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Cancel the promise, rejecting it with an optional reason
|
|
13
|
-
* @param reason Optional reason for canceling the promise
|
|
14
|
-
*/
|
|
15
|
-
cancel(reason) {
|
|
16
|
-
this.#rejector(reason);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
var PromiseTimeoutError = class extends Error {
|
|
20
|
-
constructor() {
|
|
21
|
-
super(MESSAGE_TIMEOUT);
|
|
22
|
-
this.name = ERROR_NAME;
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
async function attemptPromise(value, options) {
|
|
26
|
-
const isFunction = typeof value === "function";
|
|
27
|
-
if (!isFunction && !(value instanceof Promise)) return Promise.reject(new TypeError(MESSAGE_EXPECTATION_ATTEMPT));
|
|
28
|
-
const { signal, time } = getPromiseOptions(options);
|
|
29
|
-
if (signal?.aborted ?? false) return Promise.reject(signal.reason);
|
|
30
|
-
function abort() {
|
|
31
|
-
rejector(signal.reason);
|
|
32
|
-
}
|
|
33
|
-
async function handler(resolve, reject) {
|
|
34
|
-
try {
|
|
35
|
-
let result = isFunction ? value() : await value;
|
|
36
|
-
if (result instanceof Promise) result = await result;
|
|
37
|
-
settlePromise(abort, resolve, result, signal);
|
|
38
|
-
} catch (error) {
|
|
39
|
-
settlePromise(abort, reject, error, signal);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
let rejector;
|
|
43
|
-
signal?.addEventListener(EVENT_NAME, abort, ABORT_OPTIONS);
|
|
44
|
-
const promise = new Promise((resolve, reject) => {
|
|
45
|
-
rejector = reject;
|
|
46
|
-
handler(resolve, reject);
|
|
47
|
-
});
|
|
48
|
-
return time > 0 ? getTimed(promise, time, signal) : promise;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Create a cancelable promise
|
|
52
|
-
* @param executor Executor function for the promise
|
|
53
|
-
* @returns Cancelable promise
|
|
54
|
-
*/
|
|
55
|
-
function cancelable(executor) {
|
|
56
|
-
return new CancelablePromise(executor);
|
|
57
|
-
}
|
|
58
|
-
function delay(options) {
|
|
59
|
-
const { signal, time } = getPromiseOptions(options);
|
|
60
|
-
if (signal?.aborted ?? false) return Promise.reject(signal.reason);
|
|
61
|
-
function abort() {
|
|
62
|
-
clearTimeout(timeout);
|
|
63
|
-
rejector(signal.reason);
|
|
64
|
-
}
|
|
65
|
-
signal?.addEventListener("abort", abort, ABORT_OPTIONS);
|
|
66
|
-
let rejector;
|
|
67
|
-
let timeout;
|
|
68
|
-
return new Promise((resolve, reject) => {
|
|
69
|
-
rejector = reject;
|
|
70
|
-
timeout = setTimeout(() => {
|
|
71
|
-
settlePromise(abort, resolve, void 0, signal);
|
|
72
|
-
}, time);
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
function getNumberOrDefault(value) {
|
|
76
|
-
return typeof value === "number" && value > 0 ? value : 0;
|
|
77
|
-
}
|
|
78
|
-
function getPromiseOptions(input) {
|
|
79
|
-
if (typeof input === "number") return { time: getNumberOrDefault(input) };
|
|
80
|
-
if (input instanceof AbortSignal) return {
|
|
81
|
-
signal: input,
|
|
82
|
-
time: 0
|
|
83
|
-
};
|
|
84
|
-
const options = typeof input === "object" && input !== null ? input : {};
|
|
85
|
-
return {
|
|
86
|
-
signal: options.signal instanceof AbortSignal ? options.signal : void 0,
|
|
87
|
-
time: getNumberOrDefault(options.time)
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
function getPromisesOptions(input) {
|
|
91
|
-
if (typeof input === "string") return { strategy: getStrategyOrDefault(input) };
|
|
92
|
-
if (input instanceof AbortSignal) return {
|
|
93
|
-
signal: input,
|
|
94
|
-
strategy: DEFAULT_STRATEGY
|
|
95
|
-
};
|
|
96
|
-
const options = typeof input === "object" && input !== null ? input : {};
|
|
97
|
-
return {
|
|
98
|
-
signal: options.signal instanceof AbortSignal ? options.signal : void 0,
|
|
99
|
-
strategy: getStrategyOrDefault(options.strategy)
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function getStrategyOrDefault(value) {
|
|
103
|
-
return strategies.has(value) ? value : DEFAULT_STRATEGY;
|
|
104
|
-
}
|
|
105
|
-
async function getTimed(promise, time, signal) {
|
|
106
|
-
function abort() {
|
|
107
|
-
clearTimeout(timeout);
|
|
108
|
-
rejector(signal.reason);
|
|
109
|
-
}
|
|
110
|
-
signal?.addEventListener(EVENT_NAME, abort, ABORT_OPTIONS);
|
|
111
|
-
let rejector;
|
|
112
|
-
let timeout;
|
|
113
|
-
return Promise.race([promise, new Promise((_, reject) => {
|
|
114
|
-
rejector = reject;
|
|
115
|
-
timeout = setTimeout(() => {
|
|
116
|
-
settlePromise(abort, reject, new PromiseTimeoutError(), signal);
|
|
117
|
-
}, time);
|
|
118
|
-
})]).then((value) => {
|
|
119
|
-
clearTimeout(timeout);
|
|
120
|
-
signal?.removeEventListener(EVENT_NAME, abort);
|
|
121
|
-
return value;
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
function handleResult(status, parameters) {
|
|
125
|
-
const { abort, complete, data, handlers, index, signal, value } = parameters;
|
|
126
|
-
if (signal?.aborted ?? false) return;
|
|
127
|
-
if (!complete && status === TYPE_REJECTED) {
|
|
128
|
-
settlePromise(abort, handlers.reject, value, signal);
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
data.result[index] = !complete ? value : status === TYPE_FULFILLED ? {
|
|
132
|
-
status,
|
|
133
|
-
value
|
|
134
|
-
} : {
|
|
135
|
-
status,
|
|
136
|
-
reason: value
|
|
137
|
-
};
|
|
138
|
-
if (index === data.last) settlePromise(abort, handlers.resolve, data.result, signal);
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Is the value a fulfilled promise result?
|
|
142
|
-
* @param value Value to check
|
|
143
|
-
* @returns `true` if the value is a fulfilled promise result, `false` otherwise
|
|
144
|
-
*/
|
|
145
|
-
function isFulfilled(value) {
|
|
146
|
-
return isType(value, TYPE_FULFILLED);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Is the value a rejected promise result?
|
|
150
|
-
* @param value Value to check
|
|
151
|
-
* @returns `true` if the value is a rejected promise result, `false` otherwise
|
|
152
|
-
*/
|
|
153
|
-
function isRejected(value) {
|
|
154
|
-
return isType(value, TYPE_REJECTED);
|
|
155
|
-
}
|
|
156
|
-
function isType(value, type) {
|
|
157
|
-
return typeof value === "object" && value !== null && value.status === type;
|
|
158
|
-
}
|
|
159
|
-
async function promises(items, options) {
|
|
160
|
-
const { signal, strategy } = getPromisesOptions(options);
|
|
161
|
-
if (signal?.aborted ?? false) return Promise.reject(signal.reason);
|
|
162
|
-
if (!Array.isArray(items)) return Promise.reject(new TypeError(MESSAGE_EXPECTATION_PROMISES));
|
|
163
|
-
const actual = items.filter((item) => item instanceof Promise);
|
|
164
|
-
const { length } = actual;
|
|
165
|
-
if (length === 0) return actual;
|
|
166
|
-
const complete = strategy === DEFAULT_STRATEGY;
|
|
167
|
-
function abort() {
|
|
168
|
-
handlers.reject(signal.reason);
|
|
169
|
-
}
|
|
170
|
-
signal?.addEventListener("abort", abort, ABORT_OPTIONS);
|
|
171
|
-
const data = {
|
|
172
|
-
last: length - 1,
|
|
173
|
-
result: []
|
|
174
|
-
};
|
|
175
|
-
let handlers;
|
|
176
|
-
return new Promise((resolve, reject) => {
|
|
177
|
-
handlers = {
|
|
178
|
-
reject,
|
|
179
|
-
resolve
|
|
180
|
-
};
|
|
181
|
-
for (let index = 0; index < length; index += 1) actual[index].then((value) => handleResult(TYPE_FULFILLED, {
|
|
182
|
-
abort,
|
|
183
|
-
complete,
|
|
184
|
-
data,
|
|
185
|
-
handlers,
|
|
186
|
-
index,
|
|
187
|
-
signal,
|
|
188
|
-
value
|
|
189
|
-
})).catch((reason) => handleResult(TYPE_REJECTED, {
|
|
190
|
-
abort,
|
|
191
|
-
complete,
|
|
192
|
-
data,
|
|
193
|
-
handlers,
|
|
194
|
-
index,
|
|
195
|
-
signal,
|
|
196
|
-
value: reason
|
|
197
|
-
}));
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
function settlePromise(aborter, settler, value, signal) {
|
|
201
|
-
signal?.removeEventListener(EVENT_NAME, aborter);
|
|
202
|
-
settler(value);
|
|
203
|
-
}
|
|
204
|
-
async function timed(promise, options) {
|
|
205
|
-
if (!(promise instanceof Promise)) return Promise.reject(new TypeError(MESSAGE_EXPECTATION_TIMED));
|
|
206
|
-
const { signal, time } = getPromiseOptions(options);
|
|
207
|
-
if (signal?.aborted ?? false) return Promise.reject(signal.reason);
|
|
208
|
-
return time > 0 ? getTimed(promise, time, signal) : promise;
|
|
209
|
-
}
|
|
210
|
-
var ABORT_OPTIONS = { once: true };
|
|
211
|
-
var DEFAULT_STRATEGY = "complete";
|
|
212
|
-
var ERROR_NAME = "PromiseTimeoutError";
|
|
213
|
-
var EVENT_NAME = "abort";
|
|
214
|
-
var MESSAGE_EXPECTATION_ATTEMPT = "Attempt expected a function or a promise";
|
|
215
|
-
var MESSAGE_EXPECTATION_PROMISES = "Promises expected an array of promises";
|
|
216
|
-
var MESSAGE_EXPECTATION_TIMED = "Timed function expected a Promise";
|
|
217
|
-
var MESSAGE_TIMEOUT = "Promise timed out";
|
|
218
|
-
var strategies = new Set(["complete", "first"]);
|
|
219
|
-
var TYPE_FULFILLED = "fulfilled";
|
|
220
|
-
var TYPE_REJECTED = "rejected";
|
|
221
|
-
export { CancelablePromise, PromiseTimeoutError, attemptPromise, cancelable, delay, isFulfilled, isRejected, promises, timed };
|