@ls-stack/utils 3.65.0 → 3.66.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/{arrayUtils.d.cts → arrayUtils.d.mts} +24 -23
- package/dist/arrayUtils.mjs +249 -0
- package/dist/assertions-qMxfVhSu.mjs +207 -0
- package/dist/{assertions.d.ts → assertions.d.mts} +4 -3
- package/dist/assertions.mjs +3 -0
- package/dist/asyncQueue.d.mts +497 -0
- package/dist/asyncQueue.mjs +757 -0
- package/dist/{awaitDebounce.d.cts → awaitDebounce.d.mts} +11 -6
- package/dist/awaitDebounce.mjs +54 -0
- package/dist/{cache.d.ts → cache.d.mts} +76 -68
- package/dist/cache.mjs +355 -0
- package/dist/castValues-DfICShCc.mjs +19 -0
- package/dist/{castValues.d.cts → castValues.d.mts} +3 -2
- package/dist/castValues.mjs +3 -0
- package/dist/{concurrentCalls.d.ts → concurrentCalls.d.mts} +74 -65
- package/dist/concurrentCalls.mjs +295 -0
- package/dist/consoleFmt.d.mts +55 -0
- package/dist/consoleFmt.mjs +63 -0
- package/dist/conversions-DTmwEMIu.mjs +12 -0
- package/dist/conversions.d.mts +4 -0
- package/dist/conversions.mjs +3 -0
- package/dist/createThrottleController.d.mts +18 -0
- package/dist/createThrottleController.mjs +40 -0
- package/dist/debounce.d.mts +47 -0
- package/dist/debounce.mjs +117 -0
- package/dist/dedent.d.mts +74 -0
- package/dist/dedent.mjs +80 -0
- package/dist/deepEqual-C7EZEixx.mjs +78 -0
- package/dist/{deepEqual.d.cts → deepEqual.d.mts} +3 -2
- package/dist/deepEqual.mjs +3 -0
- package/dist/{deepReplaceValues.d.cts → deepReplaceValues.d.mts} +4 -3
- package/dist/deepReplaceValues.mjs +61 -0
- package/dist/diffParser.d.mts +63 -0
- package/dist/diffParser.mjs +410 -0
- package/dist/enhancedMap.d.mts +21 -0
- package/dist/enhancedMap.mjs +69 -0
- package/dist/exhaustiveMatch.d.mts +10 -0
- package/dist/exhaustiveMatch.mjs +48 -0
- package/dist/{filterObjectOrArrayKeys.d.cts → filterObjectOrArrayKeys.d.mts} +15 -8
- package/dist/filterObjectOrArrayKeys.mjs +497 -0
- package/dist/{getAutoIncrementId.d.cts → getAutoIncrementId.d.mts} +9 -5
- package/dist/getAutoIncrementId.mjs +53 -0
- package/dist/{getCompositeKey.d.cts → getCompositeKey.d.mts} +3 -2
- package/dist/getCompositeKey.mjs +50 -0
- package/dist/{getValueStableKey.d.cts → getValueStableKey.d.mts} +5 -3
- package/dist/getValueStableKey.mjs +17 -0
- package/dist/{hash.d.cts → hash.d.mts} +3 -2
- package/dist/hash.mjs +28 -0
- package/dist/interpolate.d.mts +17 -0
- package/dist/interpolate.mjs +28 -0
- package/dist/{iteratorUtils.d.cts → iteratorUtils.d.mts} +5 -4
- package/dist/iteratorUtils.mjs +39 -0
- package/dist/keepPrevIfUnchanged.d.mts +12 -0
- package/dist/keepPrevIfUnchanged.mjs +9 -0
- package/dist/keyedMap.d.mts +76 -0
- package/dist/keyedMap.mjs +139 -0
- package/dist/keyedSet.d.mts +77 -0
- package/dist/keyedSet.mjs +129 -0
- package/dist/{levenshtein.d.cts → levenshtein.d.mts} +3 -2
- package/dist/levenshtein.mjs +121 -0
- package/dist/main.d.mts +4 -0
- package/dist/main.mjs +7 -0
- package/dist/matchPath.d.mts +50 -0
- package/dist/matchPath.mjs +81 -0
- package/dist/mathUtils-BDP1lM_z.mjs +81 -0
- package/dist/{mathUtils.d.cts → mathUtils.d.mts} +3 -2
- package/dist/mathUtils.mjs +3 -0
- package/dist/{mutationUtils.d.cts → mutationUtils.d.mts} +6 -5
- package/dist/mutationUtils.mjs +44 -0
- package/dist/{objUtils.d.ts → objUtils.d.mts} +8 -6
- package/dist/objUtils.mjs +115 -0
- package/dist/parallelAsyncCalls.d.mts +83 -0
- package/dist/parallelAsyncCalls.mjs +121 -0
- package/dist/partialEqual.d.mts +139 -0
- package/dist/partialEqual.mjs +1055 -0
- package/dist/promiseUtils.d.mts +9 -0
- package/dist/promiseUtils.mjs +17 -0
- package/dist/regexUtils.d.mts +18 -0
- package/dist/regexUtils.mjs +34 -0
- package/dist/{retryOnError.d.cts → retryOnError.d.mts} +38 -37
- package/dist/retryOnError.mjs +91 -0
- package/dist/{runShellCmd.d.ts → runShellCmd.d.mts} +24 -15
- package/dist/runShellCmd.mjs +151 -0
- package/dist/{safeJson.d.cts → safeJson.d.mts} +3 -2
- package/dist/safeJson.mjs +30 -0
- package/dist/{saferTyping.d.cts → saferTyping.d.mts} +4 -3
- package/dist/saferTyping.mjs +45 -0
- package/dist/serializeXML.d.mts +23 -0
- package/dist/serializeXML.mjs +74 -0
- package/dist/{shallowEqual.d.cts → shallowEqual.d.mts} +3 -2
- package/dist/shallowEqual.mjs +54 -0
- package/dist/sleep.d.mts +4 -0
- package/dist/sleep.mjs +7 -0
- package/dist/stringUtils-DjhWOiYn.mjs +113 -0
- package/dist/{stringUtils.d.cts → stringUtils.d.mts} +3 -2
- package/dist/stringUtils.mjs +3 -0
- package/dist/{testUtils.d.ts → testUtils.d.mts} +83 -52
- package/dist/testUtils.mjs +310 -0
- package/dist/{throttle.d.ts → throttle.d.mts} +18 -17
- package/dist/throttle.mjs +102 -0
- package/dist/time-sr2lhQRw.mjs +67 -0
- package/dist/{time.d.ts → time.d.mts} +8 -7
- package/dist/time.mjs +3 -0
- package/dist/{timers.d.cts → timers.d.mts} +22 -13
- package/dist/timers.mjs +220 -0
- package/dist/{tsResult.d.cts → tsResult.d.mts} +52 -48
- package/dist/tsResult.mjs +142 -0
- package/dist/typeGuards-B1mzA-Rz.mjs +128 -0
- package/dist/{typeGuards.d.cts → typeGuards.d.mts} +3 -2
- package/dist/typeGuards.mjs +3 -0
- package/dist/{typeUtils.d.ts → typeUtils.d.mts} +13 -34
- package/dist/typeUtils.mjs +1 -0
- package/dist/{typedStrings.d.cts → typedStrings.d.mts} +5 -4
- package/dist/typedStrings.mjs +131 -0
- package/dist/typingFnUtils-Bb8drgKF.mjs +101 -0
- package/dist/{typingFnUtils.d.cts → typingFnUtils.d.mts} +13 -22
- package/dist/typingFnUtils.mjs +3 -0
- package/dist/{typingTestUtils.d.cts → typingTestUtils.d.mts} +11 -15
- package/dist/typingTestUtils.mjs +80 -0
- package/dist/typingUtils.d.mts +20 -0
- package/dist/typingUtils.mjs +1 -0
- package/dist/yamlStringify.d.mts +17 -0
- package/dist/yamlStringify.mjs +189 -0
- package/package.json +65 -242
- package/dist/arrayUtils.cjs +0 -229
- package/dist/arrayUtils.d.ts +0 -171
- package/dist/arrayUtils.js +0 -42
- package/dist/assertions.cjs +0 -107
- package/dist/assertions.d.cts +0 -192
- package/dist/assertions.js +0 -25
- package/dist/asyncQueue.cjs +0 -672
- package/dist/asyncQueue.d.cts +0 -488
- package/dist/asyncQueue.d.ts +0 -488
- package/dist/asyncQueue.js +0 -631
- package/dist/awaitDebounce.cjs +0 -106
- package/dist/awaitDebounce.d.ts +0 -41
- package/dist/awaitDebounce.js +0 -28
- package/dist/cache.cjs +0 -367
- package/dist/cache.d.cts +0 -228
- package/dist/cache.js +0 -19
- package/dist/castValues.cjs +0 -50
- package/dist/castValues.d.ts +0 -4
- package/dist/castValues.js +0 -8
- package/dist/chunk-5DZT3Z5Z.js +0 -8
- package/dist/chunk-6FBIEPWU.js +0 -96
- package/dist/chunk-6FIBVC2P.js +0 -56
- package/dist/chunk-7CQPOM5I.js +0 -100
- package/dist/chunk-B6DNOZCP.js +0 -369
- package/dist/chunk-BM4PYVOX.js +0 -109
- package/dist/chunk-C2SVCIWE.js +0 -57
- package/dist/chunk-CCUPDGSZ.js +0 -132
- package/dist/chunk-DBOWTYR4.js +0 -49
- package/dist/chunk-DFXNVEH6.js +0 -14
- package/dist/chunk-DX2524CZ.js +0 -314
- package/dist/chunk-GMJTLFM6.js +0 -60
- package/dist/chunk-IATIXMCE.js +0 -20
- package/dist/chunk-II4R3VVX.js +0 -25
- package/dist/chunk-JF2MDHOJ.js +0 -40
- package/dist/chunk-JQFUKJU5.js +0 -71
- package/dist/chunk-MI4UE2PQ.js +0 -561
- package/dist/chunk-PUKVXYYL.js +0 -52
- package/dist/chunk-QQS7I7ZL.js +0 -16
- package/dist/chunk-VAAMRG4K.js +0 -20
- package/dist/chunk-WFQJUJTC.js +0 -182
- package/dist/chunk-ZXIKIA5B.js +0 -178
- package/dist/concurrentCalls.cjs +0 -406
- package/dist/concurrentCalls.d.cts +0 -116
- package/dist/concurrentCalls.js +0 -346
- package/dist/consoleFmt.cjs +0 -85
- package/dist/consoleFmt.d.cts +0 -54
- package/dist/consoleFmt.d.ts +0 -54
- package/dist/consoleFmt.js +0 -60
- package/dist/conversions.cjs +0 -44
- package/dist/conversions.d.cts +0 -3
- package/dist/conversions.d.ts +0 -3
- package/dist/conversions.js +0 -6
- package/dist/createThrottleController.cjs +0 -193
- package/dist/createThrottleController.d.cts +0 -13
- package/dist/createThrottleController.d.ts +0 -13
- package/dist/createThrottleController.js +0 -61
- package/dist/debounce.cjs +0 -157
- package/dist/debounce.d.cts +0 -46
- package/dist/debounce.d.ts +0 -46
- package/dist/debounce.js +0 -8
- package/dist/dedent.cjs +0 -104
- package/dist/dedent.d.cts +0 -73
- package/dist/dedent.d.ts +0 -73
- package/dist/dedent.js +0 -79
- package/dist/deepEqual.cjs +0 -96
- package/dist/deepEqual.d.ts +0 -21
- package/dist/deepEqual.js +0 -8
- package/dist/deepReplaceValues.cjs +0 -87
- package/dist/deepReplaceValues.d.ts +0 -27
- package/dist/deepReplaceValues.js +0 -7
- package/dist/enhancedMap.cjs +0 -131
- package/dist/enhancedMap.d.cts +0 -20
- package/dist/enhancedMap.d.ts +0 -20
- package/dist/enhancedMap.js +0 -10
- package/dist/exhaustiveMatch.cjs +0 -66
- package/dist/exhaustiveMatch.d.cts +0 -9
- package/dist/exhaustiveMatch.d.ts +0 -9
- package/dist/exhaustiveMatch.js +0 -40
- package/dist/filterObjectOrArrayKeys.cjs +0 -619
- package/dist/filterObjectOrArrayKeys.d.ts +0 -88
- package/dist/filterObjectOrArrayKeys.js +0 -9
- package/dist/getAutoIncrementId.cjs +0 -44
- package/dist/getAutoIncrementId.d.ts +0 -46
- package/dist/getAutoIncrementId.js +0 -18
- package/dist/getCompositeKey.cjs +0 -86
- package/dist/getCompositeKey.d.ts +0 -11
- package/dist/getCompositeKey.js +0 -8
- package/dist/getValueStableKey.cjs +0 -89
- package/dist/getValueStableKey.d.ts +0 -15
- package/dist/getValueStableKey.js +0 -11
- package/dist/hash.cjs +0 -57
- package/dist/hash.d.ts +0 -7
- package/dist/hash.js +0 -32
- package/dist/interpolate.cjs +0 -88
- package/dist/interpolate.d.cts +0 -11
- package/dist/interpolate.d.ts +0 -11
- package/dist/interpolate.js +0 -46
- package/dist/iteratorUtils.cjs +0 -73
- package/dist/iteratorUtils.d.ts +0 -10
- package/dist/iteratorUtils.js +0 -44
- package/dist/keepPrevIfUnchanged.cjs +0 -102
- package/dist/keepPrevIfUnchanged.d.cts +0 -7
- package/dist/keepPrevIfUnchanged.d.ts +0 -7
- package/dist/keepPrevIfUnchanged.js +0 -7
- package/dist/keyedMap.cjs +0 -224
- package/dist/keyedMap.d.cts +0 -75
- package/dist/keyedMap.d.ts +0 -75
- package/dist/keyedMap.js +0 -145
- package/dist/keyedSet.cjs +0 -205
- package/dist/keyedSet.d.cts +0 -76
- package/dist/keyedSet.d.ts +0 -76
- package/dist/keyedSet.js +0 -126
- package/dist/levenshtein.cjs +0 -180
- package/dist/levenshtein.d.ts +0 -5
- package/dist/levenshtein.js +0 -153
- package/dist/main.cjs +0 -32
- package/dist/main.d.cts +0 -3
- package/dist/main.d.ts +0 -3
- package/dist/main.js +0 -7
- package/dist/matchPath.cjs +0 -155
- package/dist/matchPath.d.cts +0 -53
- package/dist/matchPath.d.ts +0 -53
- package/dist/matchPath.js +0 -108
- package/dist/mathUtils.cjs +0 -81
- package/dist/mathUtils.d.ts +0 -54
- package/dist/mathUtils.js +0 -22
- package/dist/mutationUtils.cjs +0 -153
- package/dist/mutationUtils.d.ts +0 -15
- package/dist/mutationUtils.js +0 -55
- package/dist/objUtils.cjs +0 -242
- package/dist/objUtils.d.cts +0 -28
- package/dist/objUtils.js +0 -38
- package/dist/parallelAsyncCalls.cjs +0 -162
- package/dist/parallelAsyncCalls.d.cts +0 -82
- package/dist/parallelAsyncCalls.d.ts +0 -82
- package/dist/parallelAsyncCalls.js +0 -126
- package/dist/partialEqual.cjs +0 -1196
- package/dist/partialEqual.d.cts +0 -141
- package/dist/partialEqual.d.ts +0 -141
- package/dist/partialEqual.js +0 -1168
- package/dist/promiseUtils.cjs +0 -38
- package/dist/promiseUtils.d.cts +0 -8
- package/dist/promiseUtils.d.ts +0 -8
- package/dist/promiseUtils.js +0 -6
- package/dist/regexUtils.cjs +0 -60
- package/dist/regexUtils.d.cts +0 -17
- package/dist/regexUtils.d.ts +0 -17
- package/dist/regexUtils.js +0 -33
- package/dist/retryOnError.cjs +0 -130
- package/dist/retryOnError.d.ts +0 -83
- package/dist/retryOnError.js +0 -101
- package/dist/runShellCmd.cjs +0 -127
- package/dist/runShellCmd.d.cts +0 -90
- package/dist/runShellCmd.js +0 -98
- package/dist/safeJson.cjs +0 -45
- package/dist/safeJson.d.ts +0 -16
- package/dist/safeJson.js +0 -8
- package/dist/saferTyping.cjs +0 -52
- package/dist/saferTyping.d.ts +0 -47
- package/dist/saferTyping.js +0 -23
- package/dist/serializeXML.cjs +0 -154
- package/dist/serializeXML.d.cts +0 -22
- package/dist/serializeXML.d.ts +0 -22
- package/dist/serializeXML.js +0 -116
- package/dist/shallowEqual.cjs +0 -88
- package/dist/shallowEqual.d.ts +0 -4
- package/dist/shallowEqual.js +0 -63
- package/dist/sleep.cjs +0 -32
- package/dist/sleep.d.cts +0 -3
- package/dist/sleep.d.ts +0 -3
- package/dist/sleep.js +0 -6
- package/dist/stringUtils.cjs +0 -155
- package/dist/stringUtils.d.ts +0 -55
- package/dist/stringUtils.js +0 -50
- package/dist/testUtils.cjs +0 -1490
- package/dist/testUtils.d.cts +0 -133
- package/dist/testUtils.js +0 -359
- package/dist/throttle.cjs +0 -282
- package/dist/throttle.d.cts +0 -98
- package/dist/throttle.js +0 -38
- package/dist/time.cjs +0 -152
- package/dist/time.d.cts +0 -25
- package/dist/time.js +0 -38
- package/dist/timers.cjs +0 -194
- package/dist/timers.d.ts +0 -121
- package/dist/timers.js +0 -156
- package/dist/tsResult.cjs +0 -226
- package/dist/tsResult.d.ts +0 -114
- package/dist/tsResult.js +0 -180
- package/dist/typeGuards.cjs +0 -70
- package/dist/typeGuards.d.ts +0 -111
- package/dist/typeGuards.js +0 -18
- package/dist/typeUtils.cjs +0 -18
- package/dist/typeUtils.d.cts +0 -61
- package/dist/typeUtils.js +0 -0
- package/dist/typedStrings.cjs +0 -90
- package/dist/typedStrings.d.ts +0 -163
- package/dist/typedStrings.js +0 -57
- package/dist/typingFnUtils.cjs +0 -96
- package/dist/typingFnUtils.d.ts +0 -100
- package/dist/typingFnUtils.js +0 -30
- package/dist/typingTestUtils.cjs +0 -52
- package/dist/typingTestUtils.d.ts +0 -79
- package/dist/typingTestUtils.js +0 -27
- package/dist/typingUtils.cjs +0 -18
- package/dist/typingUtils.d.cts +0 -35
- package/dist/typingUtils.d.ts +0 -35
- package/dist/typingUtils.js +0 -0
- package/dist/yamlStringify.cjs +0 -423
- package/dist/yamlStringify.d.cts +0 -10
- package/dist/yamlStringify.d.ts +0 -10
- package/dist/yamlStringify.js +0 -9
package/dist/hash.mjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/hash.ts
|
|
2
|
+
/**
|
|
3
|
+
* @param str - The string to hash.
|
|
4
|
+
* @returns The hash of the string.
|
|
5
|
+
*/
|
|
6
|
+
function murmur2(str) {
|
|
7
|
+
let h = 0;
|
|
8
|
+
let k, i = 0, len = str.length;
|
|
9
|
+
for (; len >= 4; ++i, len -= 4) {
|
|
10
|
+
k = str.charCodeAt(i) & 255 | (str.charCodeAt(++i) & 255) << 8 | (str.charCodeAt(++i) & 255) << 16 | (str.charCodeAt(++i) & 255) << 24;
|
|
11
|
+
k = (k & 65535) * 1540483477 + ((k >>> 16) * 59797 << 16);
|
|
12
|
+
k ^= k >>> 24;
|
|
13
|
+
h = (k & 65535) * 1540483477 + ((k >>> 16) * 59797 << 16) ^ (h & 65535) * 1540483477 + ((h >>> 16) * 59797 << 16);
|
|
14
|
+
}
|
|
15
|
+
switch (len) {
|
|
16
|
+
case 3: h ^= (str.charCodeAt(i + 2) & 255) << 16;
|
|
17
|
+
case 2: h ^= (str.charCodeAt(i + 1) & 255) << 8;
|
|
18
|
+
case 1:
|
|
19
|
+
h ^= str.charCodeAt(i) & 255;
|
|
20
|
+
h = (h & 65535) * 1540483477 + ((h >>> 16) * 59797 << 16);
|
|
21
|
+
}
|
|
22
|
+
h ^= h >>> 13;
|
|
23
|
+
h = (h & 65535) * 1540483477 + ((h >>> 16) * 59797 << 16);
|
|
24
|
+
return ((h ^ h >>> 15) >>> 0).toString(36);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { murmur2 };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/interpolate.d.ts
|
|
2
|
+
type Interval = [number, number];
|
|
3
|
+
declare function cyclicLerp(input: number, [inStart, inEnd]: Interval, [outStart, outEnd]: Interval): number;
|
|
4
|
+
type InterpolateArgs = {
|
|
5
|
+
input: number;
|
|
6
|
+
in: number[];
|
|
7
|
+
out: number[];
|
|
8
|
+
clamp?: boolean | 'start' | 'end';
|
|
9
|
+
};
|
|
10
|
+
declare function interpolate({
|
|
11
|
+
input,
|
|
12
|
+
in: inputRange,
|
|
13
|
+
out,
|
|
14
|
+
clamp
|
|
15
|
+
}: InterpolateArgs): number;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { cyclicLerp, interpolate };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { i as invariant } from "./assertions-qMxfVhSu.mjs";
|
|
2
|
+
import { a as clampRange, i as clampMin, r as clampMax } from "./mathUtils-BDP1lM_z.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/interpolate.ts
|
|
5
|
+
function mod(n, m) {
|
|
6
|
+
return (n % m + m) % m;
|
|
7
|
+
}
|
|
8
|
+
function cyclicLerp(input, [inStart, inEnd], [outStart, outEnd]) {
|
|
9
|
+
return mod((input - inStart) / (inEnd - inStart), 1) * (outEnd - outStart) + outStart;
|
|
10
|
+
}
|
|
11
|
+
function findRange(input, inputRange) {
|
|
12
|
+
for (let i = 1; i < inputRange.length - 1; i++) if (inputRange[i] >= input) return i - 1;
|
|
13
|
+
return inputRange.length - 2;
|
|
14
|
+
}
|
|
15
|
+
function interpolate({ input, in: inputRange, out, clamp = true }) {
|
|
16
|
+
invariant(inputRange.length === out.length, "Ranges must have the same length");
|
|
17
|
+
const range = findRange(input, inputRange);
|
|
18
|
+
const inStart = inputRange[range];
|
|
19
|
+
const inEnd = inputRange[range + 1];
|
|
20
|
+
const outStart = out[range];
|
|
21
|
+
const outEnd = out[range + 1];
|
|
22
|
+
const interpolatedValue = (input - inStart) / (inEnd - inStart) * (outEnd - outStart) + outStart;
|
|
23
|
+
const outputIsAscending = outStart < outEnd;
|
|
24
|
+
return clamp === "start" ? outputIsAscending ? clampMin(interpolatedValue, outStart) : clampMax(interpolatedValue, outStart) : clamp === "end" ? outputIsAscending ? clampMax(interpolatedValue, outEnd) : clampMin(interpolatedValue, outEnd) : clamp ? clampRange(interpolatedValue, outStart, outEnd) : interpolatedValue;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { cyclicLerp, interpolate };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
//#region src/iteratorUtils.d.ts
|
|
1
2
|
declare function enumerate<T>(iter: Iterable<T>, start?: number): Generator<[number, T]>;
|
|
2
3
|
declare function withIsLast<T>(array: T[]): Generator<[isLast: boolean, item: T, index: number]>;
|
|
3
4
|
declare function withPrevious<T>(iter: Iterable<T>): Generator<{
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
prev: T | undefined;
|
|
6
|
+
current: T;
|
|
6
7
|
}>;
|
|
7
8
|
declare function range(start: number, end: number, step?: number): Generator<number>;
|
|
8
9
|
declare function rangeArray(start: number, end: number, step?: number): number[];
|
|
9
|
-
|
|
10
|
-
export { enumerate, range, rangeArray, withIsLast, withPrevious };
|
|
10
|
+
//#endregion
|
|
11
|
+
export { enumerate, range, rangeArray, withIsLast, withPrevious };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//#region src/iteratorUtils.ts
|
|
2
|
+
function* enumerate(iter, start = 0) {
|
|
3
|
+
let index = start;
|
|
4
|
+
for (const item of iter) {
|
|
5
|
+
yield [index, item];
|
|
6
|
+
index++;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function* withIsLast(array) {
|
|
10
|
+
let index = 0;
|
|
11
|
+
for (const item of array) {
|
|
12
|
+
yield [
|
|
13
|
+
index === array.length - 1,
|
|
14
|
+
item,
|
|
15
|
+
index
|
|
16
|
+
];
|
|
17
|
+
index++;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function* withPrevious(iter) {
|
|
21
|
+
let prev = void 0;
|
|
22
|
+
for (const current of iter) {
|
|
23
|
+
yield {
|
|
24
|
+
prev,
|
|
25
|
+
current
|
|
26
|
+
};
|
|
27
|
+
prev = current;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function* range(start, end, step = 1) {
|
|
31
|
+
if (start > end) for (let i = start; i >= end; i -= step) yield i;
|
|
32
|
+
else for (let i = start; i <= end; i += step) yield i;
|
|
33
|
+
}
|
|
34
|
+
function rangeArray(start, end, step = 1) {
|
|
35
|
+
return [...range(start, end, step)];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
export { enumerate, range, rangeArray, withIsLast, withPrevious };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/keepPrevIfUnchanged.d.ts
|
|
2
|
+
declare function keepPrevIfUnchanged<T>({
|
|
3
|
+
prev,
|
|
4
|
+
newValue,
|
|
5
|
+
equalityFn
|
|
6
|
+
}: {
|
|
7
|
+
prev: T;
|
|
8
|
+
newValue: T;
|
|
9
|
+
equalityFn?: (foo: any, bar: any) => boolean;
|
|
10
|
+
}): T;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { keepPrevIfUnchanged };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { t as deepEqual } from "./deepEqual-C7EZEixx.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/keepPrevIfUnchanged.ts
|
|
4
|
+
function keepPrevIfUnchanged({ prev, newValue, equalityFn = deepEqual }) {
|
|
5
|
+
return equalityFn(prev, newValue) ? prev : newValue;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
export { keepPrevIfUnchanged };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//#region src/keyedMap.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* A Map implementation that uses a custom key function to determine key equality.
|
|
4
|
+
* Keys with the same computed internal key are considered equal.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const map = new KeyedMap<{ x: number; y: number }, string, string>(
|
|
8
|
+
* (key) => `${key.x},${key.y}`,
|
|
9
|
+
* );
|
|
10
|
+
* map.set({ x: 1, y: 2 }, 'point A');
|
|
11
|
+
* map.get({ x: 1, y: 2 }); // 'point A' (different object, same computed key)
|
|
12
|
+
*
|
|
13
|
+
* @template K - The type of the external key
|
|
14
|
+
* @template V - The type of the value
|
|
15
|
+
* @template InternalKey - The type of the internal key used for comparison
|
|
16
|
+
*/
|
|
17
|
+
declare class KeyedMap<K, V, InternalKey = string> {
|
|
18
|
+
private map;
|
|
19
|
+
private getKey;
|
|
20
|
+
/**
|
|
21
|
+
* @param getKey - Function to compute an internal key from the external key
|
|
22
|
+
* @param entries - Optional initial entries to add to the map
|
|
23
|
+
*/
|
|
24
|
+
constructor(getKey: (key: K) => InternalKey, entries?: Iterable<[K, V]>);
|
|
25
|
+
/** The number of entries in the map */
|
|
26
|
+
get size(): number;
|
|
27
|
+
/** Sets a value for the given key. If the key exists, replaces both key and value. */
|
|
28
|
+
set(key: K, value: V): this;
|
|
29
|
+
/** Sets multiple entries at once. */
|
|
30
|
+
setMultiple(entries: Iterable<[K, V]>): this;
|
|
31
|
+
/** Gets the value for the given key, or undefined if not found. */
|
|
32
|
+
get(key: K): V | undefined;
|
|
33
|
+
/** Checks if the map contains the given key. */
|
|
34
|
+
has(key: K): boolean;
|
|
35
|
+
/** Removes the entry for the given key. Returns true if the entry was removed. */
|
|
36
|
+
delete(key: K): boolean;
|
|
37
|
+
/** Removes multiple entries. Returns the number of entries removed. */
|
|
38
|
+
deleteMultiple(keys: Iterable<K>): number;
|
|
39
|
+
/** Removes all entries from the map. */
|
|
40
|
+
clear(): void;
|
|
41
|
+
/** Executes a callback for each entry in the map. */
|
|
42
|
+
forEach(callback: (value: V, key: K, map: KeyedMap<K, V, InternalKey>) => void, thisArg?: unknown): void;
|
|
43
|
+
/** Finds the first entry matching the predicate. */
|
|
44
|
+
find(predicate: (value: V, key: K) => boolean): {
|
|
45
|
+
key: K;
|
|
46
|
+
value: V;
|
|
47
|
+
} | undefined;
|
|
48
|
+
/** Gets the value for the given key, or throws if not found. */
|
|
49
|
+
getOrThrow(key: K): V;
|
|
50
|
+
/** Gets the value for the given key, or inserts and returns the fallback value. */
|
|
51
|
+
getOrInsert(key: K, fallback: () => V): V;
|
|
52
|
+
/** Returns values that match the predicate. */
|
|
53
|
+
toFilteredValues(predicate: (value: V, key: K) => boolean): V[];
|
|
54
|
+
/** Returns all values as an array. */
|
|
55
|
+
toValues(): V[];
|
|
56
|
+
/** Returns all keys as an array. */
|
|
57
|
+
toKeys(): K[];
|
|
58
|
+
keys(): IterableIterator<K>;
|
|
59
|
+
values(): IterableIterator<V>;
|
|
60
|
+
entries(): IterableIterator<[K, V]>;
|
|
61
|
+
[Symbol.iterator](): IterableIterator<[K, V]>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* A Map that compares keys by value instead of reference.
|
|
65
|
+
* Uses `getCompositeKey` to generate a stable string key for any value.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* const map = new CompositeKeyMap<{ x: number; y: number }, string>();
|
|
69
|
+
* map.set({ x: 1, y: 2 }, 'point A');
|
|
70
|
+
* map.get({ x: 1, y: 2 }); // 'point A' (different object, same value)
|
|
71
|
+
*/
|
|
72
|
+
declare class CompositeKeyMap<K, V> extends KeyedMap<K, V, string> {
|
|
73
|
+
constructor(entries?: Iterable<[K, V]>);
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
export { CompositeKeyMap, KeyedMap };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { getCompositeKey } from "./getCompositeKey.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/keyedMap.ts
|
|
4
|
+
/**
|
|
5
|
+
* A Map implementation that uses a custom key function to determine key equality.
|
|
6
|
+
* Keys with the same computed internal key are considered equal.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const map = new KeyedMap<{ x: number; y: number }, string, string>(
|
|
10
|
+
* (key) => `${key.x},${key.y}`,
|
|
11
|
+
* );
|
|
12
|
+
* map.set({ x: 1, y: 2 }, 'point A');
|
|
13
|
+
* map.get({ x: 1, y: 2 }); // 'point A' (different object, same computed key)
|
|
14
|
+
*
|
|
15
|
+
* @template K - The type of the external key
|
|
16
|
+
* @template V - The type of the value
|
|
17
|
+
* @template InternalKey - The type of the internal key used for comparison
|
|
18
|
+
*/
|
|
19
|
+
var KeyedMap = class {
|
|
20
|
+
map;
|
|
21
|
+
getKey;
|
|
22
|
+
/**
|
|
23
|
+
* @param getKey - Function to compute an internal key from the external key
|
|
24
|
+
* @param entries - Optional initial entries to add to the map
|
|
25
|
+
*/
|
|
26
|
+
constructor(getKey, entries) {
|
|
27
|
+
this.getKey = getKey;
|
|
28
|
+
this.map = /* @__PURE__ */ new Map();
|
|
29
|
+
if (entries) for (const [key, value] of entries) this.set(key, value);
|
|
30
|
+
}
|
|
31
|
+
/** The number of entries in the map */
|
|
32
|
+
get size() {
|
|
33
|
+
return this.map.size;
|
|
34
|
+
}
|
|
35
|
+
/** Sets a value for the given key. If the key exists, replaces both key and value. */
|
|
36
|
+
set(key, value) {
|
|
37
|
+
const internalKey = this.getKey(key);
|
|
38
|
+
this.map.set(internalKey, {
|
|
39
|
+
key,
|
|
40
|
+
value
|
|
41
|
+
});
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
/** Sets multiple entries at once. */
|
|
45
|
+
setMultiple(entries) {
|
|
46
|
+
for (const [key, value] of entries) this.set(key, value);
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
/** Gets the value for the given key, or undefined if not found. */
|
|
50
|
+
get(key) {
|
|
51
|
+
const internalKey = this.getKey(key);
|
|
52
|
+
return this.map.get(internalKey)?.value;
|
|
53
|
+
}
|
|
54
|
+
/** Checks if the map contains the given key. */
|
|
55
|
+
has(key) {
|
|
56
|
+
const internalKey = this.getKey(key);
|
|
57
|
+
return this.map.has(internalKey);
|
|
58
|
+
}
|
|
59
|
+
/** Removes the entry for the given key. Returns true if the entry was removed. */
|
|
60
|
+
delete(key) {
|
|
61
|
+
const internalKey = this.getKey(key);
|
|
62
|
+
return this.map.delete(internalKey);
|
|
63
|
+
}
|
|
64
|
+
/** Removes multiple entries. Returns the number of entries removed. */
|
|
65
|
+
deleteMultiple(keys) {
|
|
66
|
+
let count = 0;
|
|
67
|
+
for (const key of keys) if (this.delete(key)) count++;
|
|
68
|
+
return count;
|
|
69
|
+
}
|
|
70
|
+
/** Removes all entries from the map. */
|
|
71
|
+
clear() {
|
|
72
|
+
this.map.clear();
|
|
73
|
+
}
|
|
74
|
+
/** Executes a callback for each entry in the map. */
|
|
75
|
+
forEach(callback, thisArg) {
|
|
76
|
+
for (const { key, value } of this.map.values()) callback.call(thisArg, value, key, this);
|
|
77
|
+
}
|
|
78
|
+
/** Finds the first entry matching the predicate. */
|
|
79
|
+
find(predicate) {
|
|
80
|
+
for (const { key, value } of this.map.values()) if (predicate(value, key)) return {
|
|
81
|
+
key,
|
|
82
|
+
value
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Gets the value for the given key, or throws if not found. */
|
|
86
|
+
getOrThrow(key) {
|
|
87
|
+
const value = this.get(key);
|
|
88
|
+
if (value === void 0 && !this.has(key)) throw new Error(`Key not found in KeyedMap`);
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
/** Gets the value for the given key, or inserts and returns the fallback value. */
|
|
92
|
+
getOrInsert(key, fallback) {
|
|
93
|
+
if (!this.has(key)) this.set(key, fallback());
|
|
94
|
+
return this.getOrThrow(key);
|
|
95
|
+
}
|
|
96
|
+
/** Returns values that match the predicate. */
|
|
97
|
+
toFilteredValues(predicate) {
|
|
98
|
+
const values = [];
|
|
99
|
+
for (const { key, value } of this.map.values()) if (predicate(value, key)) values.push(value);
|
|
100
|
+
return values;
|
|
101
|
+
}
|
|
102
|
+
/** Returns all values as an array. */
|
|
103
|
+
toValues() {
|
|
104
|
+
return [...this.values()];
|
|
105
|
+
}
|
|
106
|
+
/** Returns all keys as an array. */
|
|
107
|
+
toKeys() {
|
|
108
|
+
return [...this.keys()];
|
|
109
|
+
}
|
|
110
|
+
*keys() {
|
|
111
|
+
for (const { key } of this.map.values()) yield key;
|
|
112
|
+
}
|
|
113
|
+
*values() {
|
|
114
|
+
for (const { value } of this.map.values()) yield value;
|
|
115
|
+
}
|
|
116
|
+
*entries() {
|
|
117
|
+
for (const { key, value } of this.map.values()) yield [key, value];
|
|
118
|
+
}
|
|
119
|
+
[Symbol.iterator]() {
|
|
120
|
+
return this.entries();
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* A Map that compares keys by value instead of reference.
|
|
125
|
+
* Uses `getCompositeKey` to generate a stable string key for any value.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* const map = new CompositeKeyMap<{ x: number; y: number }, string>();
|
|
129
|
+
* map.set({ x: 1, y: 2 }, 'point A');
|
|
130
|
+
* map.get({ x: 1, y: 2 }); // 'point A' (different object, same value)
|
|
131
|
+
*/
|
|
132
|
+
var CompositeKeyMap = class extends KeyedMap {
|
|
133
|
+
constructor(entries) {
|
|
134
|
+
super(getCompositeKey, entries);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
//#endregion
|
|
139
|
+
export { CompositeKeyMap, KeyedMap };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
//#region src/keyedSet.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* A Set implementation that uses a custom key function to determine uniqueness.
|
|
4
|
+
* Items with the same key are considered equal, and adding a duplicate replaces
|
|
5
|
+
* the existing item.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const set = new KeyedSet<{ id: number; name: string }, number>(
|
|
9
|
+
* (item) => item.id,
|
|
10
|
+
* );
|
|
11
|
+
* set.add({ id: 1, name: 'one' });
|
|
12
|
+
* set.add({ id: 1, name: 'replaced' }); // replaces previous item
|
|
13
|
+
* set.getByKey(1); // { id: 1, name: 'replaced' }
|
|
14
|
+
*
|
|
15
|
+
* @template T - The type of items stored in the set
|
|
16
|
+
* @template K - The type of the key extracted from items
|
|
17
|
+
*/
|
|
18
|
+
declare class KeyedSet<T, K = string> {
|
|
19
|
+
private map;
|
|
20
|
+
private getKey;
|
|
21
|
+
/**
|
|
22
|
+
* @param getKey - Function to extract a unique key from each item
|
|
23
|
+
* @param iterable - Optional initial items to add to the set
|
|
24
|
+
*/
|
|
25
|
+
constructor(getKey: (item: T) => K, iterable?: Iterable<T>);
|
|
26
|
+
/** The number of items in the set */
|
|
27
|
+
get size(): number;
|
|
28
|
+
/**
|
|
29
|
+
* Adds an item to the set. If an item with the same key exists, it will be
|
|
30
|
+
* replaced.
|
|
31
|
+
*/
|
|
32
|
+
add(item: T): this;
|
|
33
|
+
/** Adds multiple items to the set. */
|
|
34
|
+
addMultiple(items: Iterable<T>): this;
|
|
35
|
+
/** Checks if an item with the same key exists in the set. */
|
|
36
|
+
has(item: T): boolean;
|
|
37
|
+
/** Checks if an item with the given key exists in the set. */
|
|
38
|
+
hasKey(key: K): boolean;
|
|
39
|
+
/** Gets an item by its key, or undefined if not found. */
|
|
40
|
+
getByKey(key: K): T | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Removes an item from the set by computing its key. Returns true if the item
|
|
43
|
+
* was removed.
|
|
44
|
+
*/
|
|
45
|
+
delete(item: T): boolean;
|
|
46
|
+
/** Removes an item by its key. Returns true if the item was removed. */
|
|
47
|
+
deleteByKey(key: K): boolean;
|
|
48
|
+
/** Removes multiple items from the set. Returns the number of items removed. */
|
|
49
|
+
deleteMultiple(items: Iterable<T>): number;
|
|
50
|
+
/** Removes multiple items by their keys. Returns the number of items removed. */
|
|
51
|
+
deleteMultipleByKeys(keys: Iterable<K>): number;
|
|
52
|
+
/** Removes all items from the set. */
|
|
53
|
+
clear(): void;
|
|
54
|
+
/** Executes a callback for each item in the set. */
|
|
55
|
+
forEach(callback: (value: T, value2: T, set: KeyedSet<T, K>) => void, thisArg?: unknown): void;
|
|
56
|
+
values(): IterableIterator<T>;
|
|
57
|
+
keys(): IterableIterator<T>;
|
|
58
|
+
entries(): IterableIterator<[T, T]>;
|
|
59
|
+
[Symbol.iterator](): IterableIterator<T>;
|
|
60
|
+
/** Returns all items as an array. */
|
|
61
|
+
toArray(): T[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* A Set that compares items by value instead of reference. Uses
|
|
65
|
+
* `getCompositeKey` to generate a stable string key for any value.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* const set = new ValueSet<{ x: number; y: number }>();
|
|
69
|
+
* set.add({ x: 1, y: 2 });
|
|
70
|
+
* set.add({ x: 1, y: 2 }); // ignored, same value already exists
|
|
71
|
+
* set.size; // 1
|
|
72
|
+
*/
|
|
73
|
+
declare class CompositeKeySet<T> extends KeyedSet<T, string> {
|
|
74
|
+
constructor(iterable?: Iterable<T>);
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { CompositeKeySet, KeyedSet };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { getCompositeKey } from "./getCompositeKey.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/keyedSet.ts
|
|
4
|
+
/**
|
|
5
|
+
* A Set implementation that uses a custom key function to determine uniqueness.
|
|
6
|
+
* Items with the same key are considered equal, and adding a duplicate replaces
|
|
7
|
+
* the existing item.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const set = new KeyedSet<{ id: number; name: string }, number>(
|
|
11
|
+
* (item) => item.id,
|
|
12
|
+
* );
|
|
13
|
+
* set.add({ id: 1, name: 'one' });
|
|
14
|
+
* set.add({ id: 1, name: 'replaced' }); // replaces previous item
|
|
15
|
+
* set.getByKey(1); // { id: 1, name: 'replaced' }
|
|
16
|
+
*
|
|
17
|
+
* @template T - The type of items stored in the set
|
|
18
|
+
* @template K - The type of the key extracted from items
|
|
19
|
+
*/
|
|
20
|
+
var KeyedSet = class {
|
|
21
|
+
map;
|
|
22
|
+
getKey;
|
|
23
|
+
/**
|
|
24
|
+
* @param getKey - Function to extract a unique key from each item
|
|
25
|
+
* @param iterable - Optional initial items to add to the set
|
|
26
|
+
*/
|
|
27
|
+
constructor(getKey, iterable) {
|
|
28
|
+
this.getKey = getKey;
|
|
29
|
+
this.map = /* @__PURE__ */ new Map();
|
|
30
|
+
if (iterable) for (const item of iterable) this.add(item);
|
|
31
|
+
}
|
|
32
|
+
/** The number of items in the set */
|
|
33
|
+
get size() {
|
|
34
|
+
return this.map.size;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Adds an item to the set. If an item with the same key exists, it will be
|
|
38
|
+
* replaced.
|
|
39
|
+
*/
|
|
40
|
+
add(item) {
|
|
41
|
+
const key = this.getKey(item);
|
|
42
|
+
this.map.set(key, item);
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
/** Adds multiple items to the set. */
|
|
46
|
+
addMultiple(items) {
|
|
47
|
+
for (const item of items) this.add(item);
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
/** Checks if an item with the same key exists in the set. */
|
|
51
|
+
has(item) {
|
|
52
|
+
const key = this.getKey(item);
|
|
53
|
+
return this.map.has(key);
|
|
54
|
+
}
|
|
55
|
+
/** Checks if an item with the given key exists in the set. */
|
|
56
|
+
hasKey(key) {
|
|
57
|
+
return this.map.has(key);
|
|
58
|
+
}
|
|
59
|
+
/** Gets an item by its key, or undefined if not found. */
|
|
60
|
+
getByKey(key) {
|
|
61
|
+
return this.map.get(key);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Removes an item from the set by computing its key. Returns true if the item
|
|
65
|
+
* was removed.
|
|
66
|
+
*/
|
|
67
|
+
delete(item) {
|
|
68
|
+
const key = this.getKey(item);
|
|
69
|
+
return this.map.delete(key);
|
|
70
|
+
}
|
|
71
|
+
/** Removes an item by its key. Returns true if the item was removed. */
|
|
72
|
+
deleteByKey(key) {
|
|
73
|
+
return this.map.delete(key);
|
|
74
|
+
}
|
|
75
|
+
/** Removes multiple items from the set. Returns the number of items removed. */
|
|
76
|
+
deleteMultiple(items) {
|
|
77
|
+
let count = 0;
|
|
78
|
+
for (const item of items) if (this.delete(item)) count++;
|
|
79
|
+
return count;
|
|
80
|
+
}
|
|
81
|
+
/** Removes multiple items by their keys. Returns the number of items removed. */
|
|
82
|
+
deleteMultipleByKeys(keys) {
|
|
83
|
+
let count = 0;
|
|
84
|
+
for (const key of keys) if (this.deleteByKey(key)) count++;
|
|
85
|
+
return count;
|
|
86
|
+
}
|
|
87
|
+
/** Removes all items from the set. */
|
|
88
|
+
clear() {
|
|
89
|
+
this.map.clear();
|
|
90
|
+
}
|
|
91
|
+
/** Executes a callback for each item in the set. */
|
|
92
|
+
forEach(callback, thisArg) {
|
|
93
|
+
for (const value of this.map.values()) callback.call(thisArg, value, value, this);
|
|
94
|
+
}
|
|
95
|
+
*values() {
|
|
96
|
+
yield* this.map.values();
|
|
97
|
+
}
|
|
98
|
+
*keys() {
|
|
99
|
+
yield* this.map.values();
|
|
100
|
+
}
|
|
101
|
+
*entries() {
|
|
102
|
+
for (const value of this.map.values()) yield [value, value];
|
|
103
|
+
}
|
|
104
|
+
[Symbol.iterator]() {
|
|
105
|
+
return this.values();
|
|
106
|
+
}
|
|
107
|
+
/** Returns all items as an array. */
|
|
108
|
+
toArray() {
|
|
109
|
+
return [...this.map.values()];
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* A Set that compares items by value instead of reference. Uses
|
|
114
|
+
* `getCompositeKey` to generate a stable string key for any value.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* const set = new ValueSet<{ x: number; y: number }>();
|
|
118
|
+
* set.add({ x: 1, y: 2 });
|
|
119
|
+
* set.add({ x: 1, y: 2 }); // ignored, same value already exists
|
|
120
|
+
* set.size; // 1
|
|
121
|
+
*/
|
|
122
|
+
var CompositeKeySet = class extends KeyedSet {
|
|
123
|
+
constructor(iterable) {
|
|
124
|
+
super(getCompositeKey, iterable);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
//#endregion
|
|
129
|
+
export { CompositeKeySet, KeyedSet };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
//#region src/levenshtein.d.ts
|
|
1
2
|
declare function levenshteinDistance(a: string, b: string): number;
|
|
2
3
|
declare function getClosestString(str: string, arr: readonly string[], maxDistance?: number): string | undefined;
|
|
3
4
|
declare function getClosestStringsUpToDist(str: string, arr: readonly string[], maxDistance?: number): string[];
|
|
4
|
-
|
|
5
|
-
export { getClosestString, getClosestStringsUpToDist, levenshteinDistance };
|
|
5
|
+
//#endregion
|
|
6
|
+
export { getClosestString, getClosestStringsUpToDist, levenshteinDistance };
|