@oscarpalmer/atoms 0.202.0 → 0.203.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/array/difference.d.mts +4 -5
- package/dist/array/exists.d.mts +5 -6
- package/dist/array/filter.d.mts +10 -11
- package/dist/array/find.d.mts +10 -11
- package/dist/array/first.d.mts +10 -11
- package/dist/array/flatten.d.mts +2 -3
- package/dist/array/from.d.mts +7 -8
- package/dist/array/group-by.d.mts +7 -8
- package/dist/array/insert.d.mts +3 -4
- package/dist/array/intersection.d.mts +4 -5
- package/dist/array/last.d.mts +10 -11
- package/dist/array/move.d.mts +9 -10
- package/dist/array/partition.d.mts +5 -6
- package/dist/array/push.d.mts +2 -3
- package/dist/array/reverse.d.mts +2 -3
- package/dist/array/select.d.mts +11 -12
- package/dist/array/single.d.mts +4 -5
- package/dist/array/slice.d.mts +12 -13
- package/dist/array/sort.d.mts +31 -32
- package/dist/array/sort.mjs +41 -33
- package/dist/array/splice.d.mts +5 -6
- package/dist/array/swap.d.mts +8 -9
- package/dist/array/to-map.d.mts +7 -8
- package/dist/array/to-record.d.mts +7 -8
- package/dist/array/to-set.d.mts +4 -5
- package/dist/array/toggle.d.mts +4 -5
- package/dist/array/union.d.mts +4 -5
- package/dist/array/unique.d.mts +4 -5
- package/dist/array/update.d.mts +4 -5
- package/dist/beacon.d.mts +8 -9
- package/dist/beacon.mjs +90 -65
- package/dist/color/constants.d.mts +14 -13
- package/dist/color/constants.mjs +9 -2
- package/dist/color/index.d.mts +2 -2
- package/dist/color/instance.d.mts +3 -3
- package/dist/color/instance.mjs +125 -61
- package/dist/color/misc/alpha.d.mts +4 -5
- package/dist/color/misc/format.d.mts +6 -7
- package/dist/color/misc/format.mjs +15 -12
- package/dist/color/misc/get.d.mts +14 -15
- package/dist/color/misc/is.d.mts +16 -17
- package/dist/color/misc/is.mjs +3 -4
- package/dist/color/misc/state.d.mts +8 -10
- package/dist/color/misc/state.mjs +22 -20
- package/dist/color/models.d.mts +25 -19
- package/dist/color/space/hex.d.mts +9 -10
- package/dist/color/space/hsl.d.mts +8 -9
- package/dist/color/space/hwb.d.mts +9 -10
- package/dist/color/space/rgb.d.mts +11 -12
- package/dist/function/limit.d.mts +9 -8
- package/dist/function/limit.mjs +5 -5
- package/dist/function/once.d.mts +26 -6
- package/dist/function/once.mjs +135 -76
- package/dist/function/retry.d.mts +5 -6
- package/dist/function/retry.mjs +3 -3
- package/dist/index.d.mts +182 -58
- package/dist/index.mjs +1191 -810
- package/dist/internal/abort.d.mts +3 -4
- package/dist/internal/array/callbacks.d.mts +4 -5
- package/dist/internal/array/chunk.d.mts +2 -3
- package/dist/internal/array/compact.d.mts +3 -4
- package/dist/internal/array/find.d.mts +10 -11
- package/dist/internal/array/get.d.mts +7 -8
- package/dist/internal/array/group.d.mts +2 -3
- package/dist/internal/array/index-of.d.mts +10 -11
- package/dist/internal/array/insert.d.mts +5 -6
- package/dist/internal/array/match.d.mts +17 -18
- package/dist/internal/array/overlap.d.mts +2 -3
- package/dist/internal/array/sets.d.mts +5 -6
- package/dist/internal/array/shuffle.d.mts +2 -3
- package/dist/internal/array/update.d.mts +2 -3
- package/dist/internal/defaults.d.mts +3 -4
- package/dist/internal/function/assert.d.mts +10 -11
- package/dist/internal/function/limit.d.mts +41 -0
- package/dist/internal/function/limit.mjs +110 -0
- package/dist/internal/function/memoize.d.mts +4 -5
- package/dist/internal/function/memoize.mjs +53 -31
- package/dist/internal/function/misc.d.mts +2 -3
- package/dist/internal/function/work.d.mts +53 -54
- package/dist/internal/herald.d.mts +8 -9
- package/dist/internal/herald.mjs +38 -26
- package/dist/internal/is.d.mts +19 -20
- package/dist/internal/math/aggregate.d.mts +14 -15
- package/dist/internal/math/misc.d.mts +3 -4
- package/dist/internal/number.d.mts +4 -5
- package/dist/internal/random.d.mts +3 -4
- package/dist/internal/result/misc.d.mts +29 -14
- package/dist/internal/result/misc.mjs +4 -0
- package/dist/internal/result/models.d.mts +9 -10
- package/dist/internal/sized/map.d.mts +2 -3
- package/dist/internal/sized/misc.d.mts +2 -3
- package/dist/internal/string/case.d.mts +9 -10
- package/dist/internal/string/misc.d.mts +8 -9
- package/dist/internal/subscription.d.mts +10 -11
- package/dist/internal/subscription.mjs +69 -57
- package/dist/internal/value/compare.d.mts +17 -9
- package/dist/internal/value/compare.mjs +7 -7
- package/dist/internal/value/equal.d.mts +34 -15
- package/dist/internal/value/equal.mjs +28 -13
- package/dist/internal/value/get.d.mts +3 -4
- package/dist/internal/value/handlers.d.mts +19 -9
- package/dist/internal/value/handlers.mjs +50 -50
- package/dist/internal/value/has.d.mts +6 -7
- package/dist/internal/value/misc.d.mts +6 -7
- package/dist/internal/value/partial.d.mts +3 -4
- package/dist/internal/value/set.d.mts +4 -5
- package/dist/is.d.mts +13 -13
- package/dist/logger.d.mts +5 -4
- package/dist/logger.mjs +61 -54
- package/dist/math.d.mts +20 -20
- package/dist/models.d.mts +45 -49
- package/dist/promise/constants.d.mts +14 -15
- package/dist/promise/delay.d.mts +3 -4
- package/dist/promise/delay.mjs +4 -4
- package/dist/promise/helpers.d.mts +7 -8
- package/dist/promise/index.d.mts +13 -14
- package/dist/promise/misc.d.mts +6 -6
- package/dist/promise/models.d.mts +16 -17
- package/dist/promise/timed.d.mts +4 -5
- package/dist/promise/timed.mjs +5 -5
- package/dist/query.d.mts +3 -4
- package/dist/queue.d.mts +14 -15
- package/dist/queue.mjs +185 -129
- package/dist/random.d.mts +8 -8
- package/dist/result/index.d.mts +8 -9
- package/dist/result/match.d.mts +6 -7
- package/dist/result/misc.d.mts +3 -3
- package/dist/result/work/flow.d.mts +28 -29
- package/dist/result/work/pipe.d.mts +24 -25
- package/dist/sized/set.d.mts +2 -3
- package/dist/string/fuzzy.d.mts +21 -12
- package/dist/string/fuzzy.mjs +77 -49
- package/dist/string/index.d.mts +8 -8
- package/dist/string/match.d.mts +4 -5
- package/dist/string/normalize.d.mts +8 -9
- package/dist/string/normalize.mjs +9 -4
- package/dist/string/template.d.mts +9 -9
- package/dist/string/template.mjs +11 -4
- package/dist/value/clone.d.mts +21 -13
- package/dist/value/clone.mjs +22 -20
- package/dist/value/collection.d.mts +4 -5
- package/dist/value/diff.d.mts +5 -6
- package/dist/value/freeze.d.mts +18 -19
- package/dist/value/freeze.mjs +1 -1
- package/dist/value/merge.d.mts +13 -14
- package/dist/value/merge.mjs +21 -5
- package/dist/value/omit.d.mts +2 -3
- package/dist/value/pick.d.mts +2 -3
- package/dist/value/shake.d.mts +3 -4
- package/dist/value/smush.d.mts +3 -4
- package/dist/value/transform.d.mts +15 -10
- package/dist/value/transform.mjs +12 -7
- package/dist/value/unsmush.d.mts +3 -4
- package/package.json +1 -1
- package/dist/internal/function/timer.d.mts +0 -10
- package/dist/internal/function/timer.mjs +0 -87
package/dist/function/once.mjs
CHANGED
|
@@ -1,5 +1,73 @@
|
|
|
1
1
|
import { assert } from "../internal/function/assert.mjs";
|
|
2
2
|
//#region src/function/once.ts
|
|
3
|
+
const ONCE_NAME_ASYNC = "asyncOnce";
|
|
4
|
+
const ONCE_NAME_SYNC = "once";
|
|
5
|
+
const ONCE_PROPERTY = "$once";
|
|
6
|
+
function AsyncOnce(callback) {
|
|
7
|
+
Object.defineProperty(this, ONCE_SYMBOL, { value: {
|
|
8
|
+
callback,
|
|
9
|
+
called: false,
|
|
10
|
+
cleared: false,
|
|
11
|
+
error: false,
|
|
12
|
+
finished: false,
|
|
13
|
+
items: [],
|
|
14
|
+
value: void 0
|
|
15
|
+
} });
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperties(AsyncOnce.prototype, {
|
|
18
|
+
[ONCE_PROPERTY]: { value: ONCE_NAME_ASYNC },
|
|
19
|
+
called: {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get() {
|
|
22
|
+
return this[ONCE_SYMBOL].called;
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
clear: { value: clearOnce },
|
|
26
|
+
cleared: {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get() {
|
|
29
|
+
return this[ONCE_SYMBOL].cleared;
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
error: {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get() {
|
|
35
|
+
return this[ONCE_SYMBOL].error;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
finished: {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get() {
|
|
41
|
+
return this[ONCE_SYMBOL].finished;
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
run: { value: runOnceAsync }
|
|
45
|
+
});
|
|
46
|
+
function Once(callback) {
|
|
47
|
+
Object.defineProperty(this, ONCE_SYMBOL, { value: {
|
|
48
|
+
callback,
|
|
49
|
+
called: false,
|
|
50
|
+
cleared: false,
|
|
51
|
+
value: void 0
|
|
52
|
+
} });
|
|
53
|
+
}
|
|
54
|
+
Object.defineProperties(Once.prototype, {
|
|
55
|
+
[ONCE_PROPERTY]: { value: ONCE_NAME_SYNC },
|
|
56
|
+
clear: { value: clearOnce },
|
|
57
|
+
called: {
|
|
58
|
+
enumerable: true,
|
|
59
|
+
get() {
|
|
60
|
+
return this[ONCE_SYMBOL].called;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
cleared: {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
get() {
|
|
66
|
+
return this[ONCE_SYMBOL].cleared;
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
run: { value: runOnce }
|
|
70
|
+
});
|
|
3
71
|
/**
|
|
4
72
|
* Create an asynchronous function that can only be called once, rejecting or resolving the same result on subsequent calls
|
|
5
73
|
*
|
|
@@ -10,59 +78,12 @@ import { assert } from "../internal/function/assert.mjs";
|
|
|
10
78
|
*/
|
|
11
79
|
function asyncOnce(callback) {
|
|
12
80
|
assert(() => typeof callback === "function", ONCE_MESSAGE_EXPECTATION);
|
|
13
|
-
|
|
14
|
-
called: false,
|
|
15
|
-
cleared: false,
|
|
16
|
-
error: false,
|
|
17
|
-
finished: false,
|
|
18
|
-
items: [],
|
|
19
|
-
value: void 0
|
|
20
|
-
};
|
|
21
|
-
const fn = (...parameters) => {
|
|
22
|
-
if (state.cleared) return Promise.reject(new Error(ONCE_MESSAGE_CLEARED));
|
|
23
|
-
if (state.finished) return state.error ? Promise.reject(state.value) : Promise.resolve(state.value);
|
|
24
|
-
if (state.called) return new Promise((resolve, reject) => {
|
|
25
|
-
state.items.push({
|
|
26
|
-
reject,
|
|
27
|
-
resolve
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
state.called = true;
|
|
31
|
-
return new Promise((resolve, reject) => {
|
|
32
|
-
state.items.push({
|
|
33
|
-
reject,
|
|
34
|
-
resolve
|
|
35
|
-
});
|
|
36
|
-
callback(...parameters).then((value) => {
|
|
37
|
-
handleOnceResult(state, value, false);
|
|
38
|
-
}).catch((error) => {
|
|
39
|
-
handleOnceResult(state, error, true);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
Object.defineProperties(fn, {
|
|
44
|
-
called: {
|
|
45
|
-
enumerable: true,
|
|
46
|
-
get: () => state.called
|
|
47
|
-
},
|
|
48
|
-
clear: { value: () => clearState(state) },
|
|
49
|
-
cleared: {
|
|
50
|
-
enumerable: true,
|
|
51
|
-
get: () => state.cleared
|
|
52
|
-
},
|
|
53
|
-
error: {
|
|
54
|
-
enumerable: true,
|
|
55
|
-
get: () => state.error
|
|
56
|
-
},
|
|
57
|
-
finished: {
|
|
58
|
-
enumerable: true,
|
|
59
|
-
get: () => state.finished
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
return fn;
|
|
81
|
+
return new AsyncOnce(callback);
|
|
63
82
|
}
|
|
64
|
-
function
|
|
83
|
+
function clearOnce() {
|
|
84
|
+
const state = this[ONCE_SYMBOL];
|
|
65
85
|
if (!state.called || state.cleared) return;
|
|
86
|
+
state.callback = void 0;
|
|
66
87
|
state.cleared = true;
|
|
67
88
|
state.value = void 0;
|
|
68
89
|
}
|
|
@@ -79,6 +100,27 @@ function handleOnceResult(state, value, error) {
|
|
|
79
100
|
}
|
|
80
101
|
}
|
|
81
102
|
/**
|
|
103
|
+
* Is the value an asynchronous once callback?
|
|
104
|
+
*
|
|
105
|
+
* @param value Value to check
|
|
106
|
+
* @returns `true` if the value is an asynchronous once callback, otherwise `false`
|
|
107
|
+
*/
|
|
108
|
+
function isAsyncOnce(value) {
|
|
109
|
+
return isOnceInstance(value, ONCE_NAME_ASYNC);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Is the value a once callback?
|
|
113
|
+
*
|
|
114
|
+
* @param value Value to check
|
|
115
|
+
* @returns `true` if the value is a once callback, otherwise `false`
|
|
116
|
+
*/
|
|
117
|
+
function isOnce(value) {
|
|
118
|
+
return isOnceInstance(value, ONCE_NAME_SYNC);
|
|
119
|
+
}
|
|
120
|
+
function isOnceInstance(value, name) {
|
|
121
|
+
return typeof value === "object" && value !== null && ONCE_PROPERTY in value && value[ONCE_PROPERTY] === name;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
82
124
|
* Create a function that can only be called once, returning the same value on subsequent calls
|
|
83
125
|
*
|
|
84
126
|
* @param callback Callback to use once
|
|
@@ -86,34 +128,51 @@ function handleOnceResult(state, value, error) {
|
|
|
86
128
|
*/
|
|
87
129
|
function once(callback) {
|
|
88
130
|
assert(() => typeof callback === "function", ONCE_MESSAGE_EXPECTATION);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
131
|
+
return new Once(callback);
|
|
132
|
+
}
|
|
133
|
+
function runOnce(...parameters) {
|
|
134
|
+
const state = this[ONCE_SYMBOL];
|
|
135
|
+
if (state.cleared) throw new Error(ONCE_MESSAGE_CLEARED);
|
|
136
|
+
if (state.called) return state.value;
|
|
137
|
+
state.called = true;
|
|
138
|
+
state.value = state.callback(...parameters);
|
|
139
|
+
return state.value;
|
|
140
|
+
}
|
|
141
|
+
function runOnceAsync(...parameters) {
|
|
142
|
+
const state = this[ONCE_SYMBOL];
|
|
143
|
+
if (state.cleared) return Promise.reject(new Error(ONCE_MESSAGE_CLEARED));
|
|
144
|
+
if (state.finished) return state.error ? Promise.reject(state.value) : Promise.resolve(state.value);
|
|
145
|
+
if (state.called) return new Promise((resolve, reject) => {
|
|
146
|
+
state.items.push({
|
|
147
|
+
reject,
|
|
148
|
+
resolve
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
state.called = true;
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
state.items.push({
|
|
154
|
+
reject,
|
|
155
|
+
resolve
|
|
156
|
+
});
|
|
157
|
+
state.callback(...parameters).then((value) => {
|
|
158
|
+
handleOnceResult(state, value, false);
|
|
159
|
+
}).catch((error) => {
|
|
160
|
+
handleOnceResult(state, error, true);
|
|
161
|
+
});
|
|
111
162
|
});
|
|
112
|
-
return fn;
|
|
113
163
|
}
|
|
114
164
|
const ONCE_MESSAGE_CLEARED = "Once has been cleared";
|
|
115
165
|
const ONCE_MESSAGE_EXPECTATION = "Once expected a function";
|
|
166
|
+
const ONCE_SYMBOL = Symbol(ONCE_PROPERTY);
|
|
167
|
+
asyncOnce.is = isAsyncOnce;
|
|
116
168
|
once.async = asyncOnce;
|
|
117
|
-
|
|
169
|
+
once.is = isOnce;
|
|
170
|
+
once.isAsync = isAsyncOnce;
|
|
171
|
+
Object.defineProperty(asyncOnce, "is", { value: isAsyncOnce });
|
|
172
|
+
Object.defineProperties(once, {
|
|
173
|
+
async: { value: asyncOnce },
|
|
174
|
+
is: { value: isOnce },
|
|
175
|
+
isAsync: { value: isAsyncOnce }
|
|
176
|
+
});
|
|
118
177
|
//#endregion
|
|
119
|
-
export { asyncOnce, once };
|
|
178
|
+
export { asyncOnce, isAsyncOnce, isOnce, once };
|
|
@@ -3,11 +3,11 @@ import { GenericAsyncCallback, GenericCallback } from "../models.mjs";
|
|
|
3
3
|
/**
|
|
4
4
|
* An error thrown when a retry fails
|
|
5
5
|
*/
|
|
6
|
-
declare class RetryError extends Error {
|
|
6
|
+
export declare class RetryError extends Error {
|
|
7
7
|
readonly original: unknown;
|
|
8
8
|
constructor(message: string, original: unknown);
|
|
9
9
|
}
|
|
10
|
-
type RetryOptions = {
|
|
10
|
+
export type RetryOptions = {
|
|
11
11
|
delay?: number;
|
|
12
12
|
times?: number;
|
|
13
13
|
when?: (error: unknown) => boolean;
|
|
@@ -39,9 +39,8 @@ declare function asyncRetry<Callback extends GenericCallback>(callback: Callback
|
|
|
39
39
|
* @param options Retry options
|
|
40
40
|
* @returns Callback result
|
|
41
41
|
*/
|
|
42
|
-
declare function retry<Callback extends GenericCallback>(callback: Callback, options?: Omit<RetryOptions, 'delay'>): ReturnType<Callback>;
|
|
43
|
-
declare namespace retry {
|
|
42
|
+
export declare function retry<Callback extends GenericCallback>(callback: Callback, options?: Omit<RetryOptions, 'delay'>): ReturnType<Callback>;
|
|
43
|
+
export declare namespace retry {
|
|
44
44
|
var async: typeof asyncRetry;
|
|
45
45
|
}
|
|
46
|
-
//#endregion
|
|
47
|
-
export { RetryError, RetryOptions, retry };
|
|
46
|
+
//#endregion
|
package/dist/function/retry.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isPlainObject } from "../internal/is.mjs";
|
|
2
2
|
import { getNumberOrDefault } from "../internal/defaults.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { LIMITER_WAIT, getLimiter } from "../internal/function/limit.mjs";
|
|
4
4
|
//#region src/function/retry.ts
|
|
5
5
|
/**
|
|
6
6
|
* An error thrown when a retry fails
|
|
@@ -32,12 +32,12 @@ async function asyncRetry(callback, options) {
|
|
|
32
32
|
if (attempts >= times || !when(error)) rejector(new RetryError(RETRY_MESSAGE_FAILED, error));
|
|
33
33
|
else {
|
|
34
34
|
attempts += 1;
|
|
35
|
-
|
|
35
|
+
limiter.run();
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
const { delay, times, when } = createRetryOptions(options);
|
|
40
|
-
const
|
|
40
|
+
const limiter = getLimiter(LIMITER_WAIT, handle, delay);
|
|
41
41
|
let attempts = 0;
|
|
42
42
|
let rejector;
|
|
43
43
|
let resolver;
|