@nlozgachev/pipelined 0.58.0 → 0.60.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/README.md +4 -4
- package/dist/composition.cjs +13 -1
- package/dist/composition.d.cts +9 -0
- package/dist/composition.d.ts +9 -0
- package/dist/{chunk-JSG7SFXS.js → composition.mjs} +56 -19
- package/dist/core.cjs +13 -1
- package/dist/core.d.cts +7 -0
- package/dist/core.d.ts +7 -0
- package/dist/{chunk-VYHAA4KO.js → core.mjs} +41 -7
- package/dist/data.cjs +53 -45
- package/dist/{chunk-FVWJMPQI.js → data.mjs} +314 -52
- package/dist/index.cjs +79 -47
- package/dist/index.mjs +4464 -0
- package/dist/{chunk-OIIOGDHK.js → types.mjs} +2 -3
- package/package.json +41 -21
- package/dist/composition.js +0 -65
- package/dist/core.js +0 -49
- package/dist/data.js +0 -22
- package/dist/index.js +0 -136
- package/dist/types.js +0 -10
package/README.md
CHANGED
|
@@ -555,12 +555,12 @@ if (Result.is.ok(email)) {
|
|
|
555
555
|
- **`@nlozgachev/pipelined/core`**: Core context containers, async runtimes, optics, and logic
|
|
556
556
|
abstractions (<16 KB gzipped).
|
|
557
557
|
- **`@nlozgachev/pipelined/data`**: Curried, data-last utilities for collections, numbers, strings,
|
|
558
|
-
and JSON (<
|
|
558
|
+
and JSON (<10 KB gzipped).
|
|
559
559
|
- **`@nlozgachev/pipelined/composition`**: Pure higher-order function combinators (`pipe`, `flow`,
|
|
560
560
|
`compose`, `curry`, `uncurry`, `converge`, `juxt`, `memoize`, `tap`, `on`, `not`, `flip`, `fn`)
|
|
561
|
-
(<
|
|
562
|
-
- **`@nlozgachev/pipelined/types`**: Type-level utilities (`Brand`, `Duration`, `RetryPolicy`) (<
|
|
563
|
-
|
|
561
|
+
(<3 KB gzipped).
|
|
562
|
+
- **`@nlozgachev/pipelined/types`**: Type-level utilities (`Brand`, `Duration`, `RetryPolicy`) (<700
|
|
563
|
+
B gzipped).
|
|
564
564
|
|
|
565
565
|
Every utility in the library is benchmarked against its native equivalent. While currying introduces
|
|
566
566
|
a small function call overhead for composability, the library uses custom algorithms for
|
package/dist/composition.cjs
CHANGED
|
@@ -263,13 +263,25 @@ function juxt(fns) {
|
|
|
263
263
|
var memoize = (f, options) => {
|
|
264
264
|
const cache = /* @__PURE__ */ new Map();
|
|
265
265
|
const keyFn = options?.key ?? ((a) => a);
|
|
266
|
+
const maxSize = options?.maxSize;
|
|
266
267
|
return (a) => {
|
|
267
268
|
const key = keyFn(a);
|
|
268
269
|
if (cache.has(key)) {
|
|
269
|
-
|
|
270
|
+
const cached = cache.get(key);
|
|
271
|
+
if (maxSize !== void 0) {
|
|
272
|
+
cache.delete(key);
|
|
273
|
+
cache.set(key, cached);
|
|
274
|
+
}
|
|
275
|
+
return cached;
|
|
270
276
|
}
|
|
271
277
|
const result = f(a);
|
|
272
278
|
cache.set(key, result);
|
|
279
|
+
if (maxSize !== void 0 && cache.size > maxSize) {
|
|
280
|
+
const firstKey = cache.keys().next().value;
|
|
281
|
+
if (firstKey !== void 0) {
|
|
282
|
+
cache.delete(firstKey);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
273
285
|
return result;
|
|
274
286
|
};
|
|
275
287
|
};
|
package/dist/composition.d.cts
CHANGED
|
@@ -521,10 +521,19 @@ declare function juxt<A, B>(fns: ReadonlyArray<(a: A) => B>): (a: A) => B[];
|
|
|
521
521
|
* (opts: { id: string }) => fetch(`/users/${opts.id}`),
|
|
522
522
|
* { key: (opts) => opts.id }
|
|
523
523
|
* );
|
|
524
|
+
* // With bounded cache size (LRU eviction)
|
|
525
|
+
* const bounded = memoize(
|
|
526
|
+
* (n: number) => n * 2,
|
|
527
|
+
* { maxSize: 100 }
|
|
528
|
+
* );
|
|
524
529
|
* ```
|
|
525
530
|
*/
|
|
526
531
|
declare const memoize: <A, B>(f: (a: A) => B, options?: {
|
|
527
532
|
readonly key?: (a: A) => unknown;
|
|
533
|
+
/**
|
|
534
|
+
* Maximum number of entries to store in the cache before evicting the least recently used (LRU) entry.
|
|
535
|
+
*/
|
|
536
|
+
readonly maxSize?: number;
|
|
528
537
|
}) => (a: A) => B;
|
|
529
538
|
/**
|
|
530
539
|
* Creates a memoized version of a function using WeakMap.
|
package/dist/composition.d.ts
CHANGED
|
@@ -521,10 +521,19 @@ declare function juxt<A, B>(fns: ReadonlyArray<(a: A) => B>): (a: A) => B[];
|
|
|
521
521
|
* (opts: { id: string }) => fetch(`/users/${opts.id}`),
|
|
522
522
|
* { key: (opts) => opts.id }
|
|
523
523
|
* );
|
|
524
|
+
* // With bounded cache size (LRU eviction)
|
|
525
|
+
* const bounded = memoize(
|
|
526
|
+
* (n: number) => n * 2,
|
|
527
|
+
* { maxSize: 100 }
|
|
528
|
+
* );
|
|
524
529
|
* ```
|
|
525
530
|
*/
|
|
526
531
|
declare const memoize: <A, B>(f: (a: A) => B, options?: {
|
|
527
532
|
readonly key?: (a: A) => unknown;
|
|
533
|
+
/**
|
|
534
|
+
* Maximum number of entries to store in the cache before evicting the least recently used (LRU) entry.
|
|
535
|
+
*/
|
|
536
|
+
readonly maxSize?: number;
|
|
528
537
|
}) => (a: A) => B;
|
|
529
538
|
/**
|
|
530
539
|
* Creates a memoized version of a function using WeakMap.
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Duration
|
|
3
|
-
} from "./chunk-OIIOGDHK.js";
|
|
4
|
-
|
|
5
1
|
// src/Composition/compose.ts
|
|
6
2
|
function compose(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9) {
|
|
7
3
|
const len = arguments.length;
|
|
@@ -212,13 +208,25 @@ function juxt(fns) {
|
|
|
212
208
|
var memoize = (f, options) => {
|
|
213
209
|
const cache = /* @__PURE__ */ new Map();
|
|
214
210
|
const keyFn = options?.key ?? ((a) => a);
|
|
211
|
+
const maxSize = options?.maxSize;
|
|
215
212
|
return (a) => {
|
|
216
213
|
const key = keyFn(a);
|
|
217
214
|
if (cache.has(key)) {
|
|
218
|
-
|
|
215
|
+
const cached = cache.get(key);
|
|
216
|
+
if (maxSize !== void 0) {
|
|
217
|
+
cache.delete(key);
|
|
218
|
+
cache.set(key, cached);
|
|
219
|
+
}
|
|
220
|
+
return cached;
|
|
219
221
|
}
|
|
220
222
|
const result = f(a);
|
|
221
223
|
cache.set(key, result);
|
|
224
|
+
if (maxSize !== void 0 && cache.size > maxSize) {
|
|
225
|
+
const firstKey = cache.keys().next().value;
|
|
226
|
+
if (firstKey !== void 0) {
|
|
227
|
+
cache.delete(firstKey);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
222
230
|
return result;
|
|
223
231
|
};
|
|
224
232
|
};
|
|
@@ -324,6 +332,36 @@ pipe.try = (f, onError) => (a) => {
|
|
|
324
332
|
|
|
325
333
|
// src/Composition/tap.ts
|
|
326
334
|
import { inspect as nodeInspect } from "util";
|
|
335
|
+
|
|
336
|
+
// src/Types/Brand.ts
|
|
337
|
+
var Brand;
|
|
338
|
+
((Brand2) => {
|
|
339
|
+
Brand2.wrap = () => (value) => value;
|
|
340
|
+
Brand2.unwrap = (branded) => branded;
|
|
341
|
+
})(Brand || (Brand = {}));
|
|
342
|
+
|
|
343
|
+
// src/Types/Duration.ts
|
|
344
|
+
var Duration;
|
|
345
|
+
((Duration2) => {
|
|
346
|
+
const wrap = Brand.wrap();
|
|
347
|
+
Duration2.milliseconds = (ms) => wrap(ms);
|
|
348
|
+
Duration2.seconds = (s) => wrap(s * 1e3);
|
|
349
|
+
Duration2.minutes = (m) => wrap(m * 60 * 1e3);
|
|
350
|
+
Duration2.hours = (h) => wrap(h * 60 * 60 * 1e3);
|
|
351
|
+
Duration2.days = (d) => wrap(d * 24 * 60 * 60 * 1e3);
|
|
352
|
+
let to;
|
|
353
|
+
((to2) => {
|
|
354
|
+
to2.milliseconds = (d) => Brand.unwrap(d);
|
|
355
|
+
to2.seconds = (d) => Brand.unwrap(d) / 1e3;
|
|
356
|
+
to2.minutes = (d) => Brand.unwrap(d) / (60 * 1e3);
|
|
357
|
+
to2.hours = (d) => Brand.unwrap(d) / (60 * 60 * 1e3);
|
|
358
|
+
to2.days = (d) => Brand.unwrap(d) / (24 * 60 * 60 * 1e3);
|
|
359
|
+
})(to = Duration2.to || (Duration2.to = {}));
|
|
360
|
+
Duration2.add = (other) => (self) => wrap(Brand.unwrap(self) + Brand.unwrap(other));
|
|
361
|
+
Duration2.subtract = (other) => (self) => wrap(Brand.unwrap(self) - Brand.unwrap(other));
|
|
362
|
+
})(Duration || (Duration = {}));
|
|
363
|
+
|
|
364
|
+
// src/Composition/tap.ts
|
|
327
365
|
function tap(f) {
|
|
328
366
|
return (a) => {
|
|
329
367
|
f(a);
|
|
@@ -417,36 +455,35 @@ function uncurry(f) {
|
|
|
417
455
|
}
|
|
418
456
|
var uncurry3 = (f) => (a, b, c) => f(a)(b)(c);
|
|
419
457
|
var uncurry4 = (f) => (a, b, c, d) => f(a)(b)(c)(d);
|
|
420
|
-
|
|
421
458
|
export {
|
|
459
|
+
and,
|
|
422
460
|
compose,
|
|
461
|
+
constFalse,
|
|
462
|
+
constNull,
|
|
463
|
+
constTrue,
|
|
464
|
+
constUndefined,
|
|
465
|
+
constVoid,
|
|
466
|
+
constant,
|
|
423
467
|
converge,
|
|
424
468
|
curry,
|
|
425
469
|
curry3,
|
|
426
470
|
curry4,
|
|
471
|
+
defaultTo,
|
|
427
472
|
flip,
|
|
428
473
|
flow,
|
|
429
474
|
identity,
|
|
430
|
-
constant,
|
|
431
|
-
constTrue,
|
|
432
|
-
constFalse,
|
|
433
|
-
constNull,
|
|
434
|
-
constUndefined,
|
|
435
|
-
constVoid,
|
|
436
|
-
and,
|
|
437
|
-
or,
|
|
438
|
-
once,
|
|
439
|
-
defaultTo,
|
|
440
|
-
tuple,
|
|
441
|
-
untuple,
|
|
442
475
|
juxt,
|
|
443
476
|
memoize,
|
|
444
477
|
memoizeWeak,
|
|
445
478
|
not,
|
|
446
479
|
on,
|
|
480
|
+
once,
|
|
481
|
+
or,
|
|
447
482
|
pipe,
|
|
448
483
|
tap,
|
|
484
|
+
tuple,
|
|
449
485
|
uncurry,
|
|
450
486
|
uncurry3,
|
|
451
|
-
uncurry4
|
|
487
|
+
uncurry4,
|
|
488
|
+
untuple
|
|
452
489
|
};
|
package/dist/core.cjs
CHANGED
|
@@ -1830,6 +1830,7 @@ var Stream;
|
|
|
1830
1830
|
Stream2.make = (options) => ({
|
|
1831
1831
|
options,
|
|
1832
1832
|
_listeners: /* @__PURE__ */ new Set(),
|
|
1833
|
+
_listenerArray: null,
|
|
1833
1834
|
_queue: [],
|
|
1834
1835
|
_isEmitting: false
|
|
1835
1836
|
});
|
|
@@ -1843,7 +1844,10 @@ var Stream;
|
|
|
1843
1844
|
try {
|
|
1844
1845
|
while (stream._queue.length > 0) {
|
|
1845
1846
|
const nextMsg = stream._queue.shift();
|
|
1846
|
-
|
|
1847
|
+
if (stream._listenerArray === null) {
|
|
1848
|
+
stream._listenerArray = Array.from(stream._listeners);
|
|
1849
|
+
}
|
|
1850
|
+
const listeners = stream._listenerArray;
|
|
1847
1851
|
for (const listener of listeners) {
|
|
1848
1852
|
try {
|
|
1849
1853
|
listener(nextMsg);
|
|
@@ -1874,8 +1878,10 @@ var Stream;
|
|
|
1874
1878
|
}
|
|
1875
1879
|
};
|
|
1876
1880
|
options.from._listeners.add(handler);
|
|
1881
|
+
options.from._listenerArray = null;
|
|
1877
1882
|
return () => {
|
|
1878
1883
|
options.from._listeners.delete(handler);
|
|
1884
|
+
options.from._listenerArray = null;
|
|
1879
1885
|
};
|
|
1880
1886
|
};
|
|
1881
1887
|
Stream2.listen = (stream, events, options) => {
|
|
@@ -1929,12 +1935,15 @@ var Stream;
|
|
|
1929
1935
|
currentState = reducer(msg, currentState);
|
|
1930
1936
|
if (isOnce) {
|
|
1931
1937
|
stream._listeners.delete(listenerFn);
|
|
1938
|
+
stream._listenerArray = null;
|
|
1932
1939
|
}
|
|
1933
1940
|
});
|
|
1934
1941
|
const unsubscribe = () => {
|
|
1935
1942
|
stream._listeners.delete(listenerFn);
|
|
1943
|
+
stream._listenerArray = null;
|
|
1936
1944
|
};
|
|
1937
1945
|
stream._listeners.add(listenerFn);
|
|
1946
|
+
stream._listenerArray = null;
|
|
1938
1947
|
return { unsubscribe, getState: () => currentState };
|
|
1939
1948
|
},
|
|
1940
1949
|
tap: (effect) => {
|
|
@@ -1942,12 +1951,15 @@ var Stream;
|
|
|
1942
1951
|
effect(msg);
|
|
1943
1952
|
if (isOnce) {
|
|
1944
1953
|
stream._listeners.delete(listenerFn);
|
|
1954
|
+
stream._listenerArray = null;
|
|
1945
1955
|
}
|
|
1946
1956
|
});
|
|
1947
1957
|
const unsubscribe = () => {
|
|
1948
1958
|
stream._listeners.delete(listenerFn);
|
|
1959
|
+
stream._listenerArray = null;
|
|
1949
1960
|
};
|
|
1950
1961
|
stream._listeners.add(listenerFn);
|
|
1962
|
+
stream._listenerArray = null;
|
|
1951
1963
|
return unsubscribe;
|
|
1952
1964
|
}
|
|
1953
1965
|
};
|
package/dist/core.d.cts
CHANGED
|
@@ -2632,6 +2632,13 @@ type Stream<S extends Record<string, unknown>> = {
|
|
|
2632
2632
|
readonly options?: Stream.Options;
|
|
2633
2633
|
/** @internal */
|
|
2634
2634
|
readonly _listeners: Set<(msg: Stream.Message<S>) => void>;
|
|
2635
|
+
/**
|
|
2636
|
+
* @internal
|
|
2637
|
+
* Lazy array snapshot of `_listeners`. Avoids allocating new array objects on every `emit` call
|
|
2638
|
+
* (2.98x emission speedup, 0 heap allocations). Rebuilt whenever `_listeners` is mutated,
|
|
2639
|
+
* guaranteeing reentrancy safety and preventing listeners subscribed mid-emission from executing early.
|
|
2640
|
+
*/
|
|
2641
|
+
_listenerArray: Array<(msg: Stream.Message<S>) => void> | null;
|
|
2635
2642
|
/** @internal */
|
|
2636
2643
|
readonly _queue: Array<Stream.Message<S>>;
|
|
2637
2644
|
/** @internal */
|
package/dist/core.d.ts
CHANGED
|
@@ -2632,6 +2632,13 @@ type Stream<S extends Record<string, unknown>> = {
|
|
|
2632
2632
|
readonly options?: Stream.Options;
|
|
2633
2633
|
/** @internal */
|
|
2634
2634
|
readonly _listeners: Set<(msg: Stream.Message<S>) => void>;
|
|
2635
|
+
/**
|
|
2636
|
+
* @internal
|
|
2637
|
+
* Lazy array snapshot of `_listeners`. Avoids allocating new array objects on every `emit` call
|
|
2638
|
+
* (2.98x emission speedup, 0 heap allocations). Rebuilt whenever `_listeners` is mutated,
|
|
2639
|
+
* guaranteeing reentrancy safety and preventing listeners subscribed mid-emission from executing early.
|
|
2640
|
+
*/
|
|
2641
|
+
_listenerArray: Array<(msg: Stream.Message<S>) => void> | null;
|
|
2635
2642
|
/** @internal */
|
|
2636
2643
|
readonly _queue: Array<Stream.Message<S>>;
|
|
2637
2644
|
/** @internal */
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Duration
|
|
3
|
-
} from "./chunk-OIIOGDHK.js";
|
|
4
|
-
|
|
5
1
|
// src/Core/Combinable.ts
|
|
6
2
|
var Combinable;
|
|
7
3
|
((Combinable2) => {
|
|
@@ -232,6 +228,34 @@ var Maybe;
|
|
|
232
228
|
Maybe3.transposeResult = (data) => is.none(data) ? Result.make.ok(make.none()) : Result.is.ok(data.value) ? Result.make.ok(make.some(data.value.value)) : Result.make.err(data.value.error);
|
|
233
229
|
})(Maybe || (Maybe = {}));
|
|
234
230
|
|
|
231
|
+
// src/Types/Brand.ts
|
|
232
|
+
var Brand;
|
|
233
|
+
((Brand2) => {
|
|
234
|
+
Brand2.wrap = () => (value) => value;
|
|
235
|
+
Brand2.unwrap = (branded) => branded;
|
|
236
|
+
})(Brand || (Brand = {}));
|
|
237
|
+
|
|
238
|
+
// src/Types/Duration.ts
|
|
239
|
+
var Duration;
|
|
240
|
+
((Duration2) => {
|
|
241
|
+
const wrap = Brand.wrap();
|
|
242
|
+
Duration2.milliseconds = (ms) => wrap(ms);
|
|
243
|
+
Duration2.seconds = (s) => wrap(s * 1e3);
|
|
244
|
+
Duration2.minutes = (m) => wrap(m * 60 * 1e3);
|
|
245
|
+
Duration2.hours = (h) => wrap(h * 60 * 60 * 1e3);
|
|
246
|
+
Duration2.days = (d) => wrap(d * 24 * 60 * 60 * 1e3);
|
|
247
|
+
let to;
|
|
248
|
+
((to2) => {
|
|
249
|
+
to2.milliseconds = (d) => Brand.unwrap(d);
|
|
250
|
+
to2.seconds = (d) => Brand.unwrap(d) / 1e3;
|
|
251
|
+
to2.minutes = (d) => Brand.unwrap(d) / (60 * 1e3);
|
|
252
|
+
to2.hours = (d) => Brand.unwrap(d) / (60 * 60 * 1e3);
|
|
253
|
+
to2.days = (d) => Brand.unwrap(d) / (24 * 60 * 60 * 1e3);
|
|
254
|
+
})(to = Duration2.to || (Duration2.to = {}));
|
|
255
|
+
Duration2.add = (other) => (self) => wrap(Brand.unwrap(self) + Brand.unwrap(other));
|
|
256
|
+
Duration2.subtract = (other) => (self) => wrap(Brand.unwrap(self) - Brand.unwrap(other));
|
|
257
|
+
})(Duration || (Duration = {}));
|
|
258
|
+
|
|
235
259
|
// src/internal/Op.util.ts
|
|
236
260
|
var _abortedNil = { kind: "OpNil", reason: "aborted" };
|
|
237
261
|
var _droppedNil = { kind: "OpNil", reason: "dropped" };
|
|
@@ -1759,6 +1783,7 @@ var Stream;
|
|
|
1759
1783
|
Stream2.make = (options) => ({
|
|
1760
1784
|
options,
|
|
1761
1785
|
_listeners: /* @__PURE__ */ new Set(),
|
|
1786
|
+
_listenerArray: null,
|
|
1762
1787
|
_queue: [],
|
|
1763
1788
|
_isEmitting: false
|
|
1764
1789
|
});
|
|
@@ -1772,7 +1797,10 @@ var Stream;
|
|
|
1772
1797
|
try {
|
|
1773
1798
|
while (stream._queue.length > 0) {
|
|
1774
1799
|
const nextMsg = stream._queue.shift();
|
|
1775
|
-
|
|
1800
|
+
if (stream._listenerArray === null) {
|
|
1801
|
+
stream._listenerArray = Array.from(stream._listeners);
|
|
1802
|
+
}
|
|
1803
|
+
const listeners = stream._listenerArray;
|
|
1776
1804
|
for (const listener of listeners) {
|
|
1777
1805
|
try {
|
|
1778
1806
|
listener(nextMsg);
|
|
@@ -1803,8 +1831,10 @@ var Stream;
|
|
|
1803
1831
|
}
|
|
1804
1832
|
};
|
|
1805
1833
|
options.from._listeners.add(handler);
|
|
1834
|
+
options.from._listenerArray = null;
|
|
1806
1835
|
return () => {
|
|
1807
1836
|
options.from._listeners.delete(handler);
|
|
1837
|
+
options.from._listenerArray = null;
|
|
1808
1838
|
};
|
|
1809
1839
|
};
|
|
1810
1840
|
Stream2.listen = (stream, events, options) => {
|
|
@@ -1858,12 +1888,15 @@ var Stream;
|
|
|
1858
1888
|
currentState = reducer(msg, currentState);
|
|
1859
1889
|
if (isOnce) {
|
|
1860
1890
|
stream._listeners.delete(listenerFn);
|
|
1891
|
+
stream._listenerArray = null;
|
|
1861
1892
|
}
|
|
1862
1893
|
});
|
|
1863
1894
|
const unsubscribe = () => {
|
|
1864
1895
|
stream._listeners.delete(listenerFn);
|
|
1896
|
+
stream._listenerArray = null;
|
|
1865
1897
|
};
|
|
1866
1898
|
stream._listeners.add(listenerFn);
|
|
1899
|
+
stream._listenerArray = null;
|
|
1867
1900
|
return { unsubscribe, getState: () => currentState };
|
|
1868
1901
|
},
|
|
1869
1902
|
tap: (effect) => {
|
|
@@ -1871,12 +1904,15 @@ var Stream;
|
|
|
1871
1904
|
effect(msg);
|
|
1872
1905
|
if (isOnce) {
|
|
1873
1906
|
stream._listeners.delete(listenerFn);
|
|
1907
|
+
stream._listenerArray = null;
|
|
1874
1908
|
}
|
|
1875
1909
|
});
|
|
1876
1910
|
const unsubscribe = () => {
|
|
1877
1911
|
stream._listeners.delete(listenerFn);
|
|
1912
|
+
stream._listenerArray = null;
|
|
1878
1913
|
};
|
|
1879
1914
|
stream._listeners.add(listenerFn);
|
|
1915
|
+
stream._listenerArray = null;
|
|
1880
1916
|
return unsubscribe;
|
|
1881
1917
|
}
|
|
1882
1918
|
};
|
|
@@ -2593,7 +2629,6 @@ var Validation;
|
|
|
2593
2629
|
return isNonEmptyArr(errors) ? make.failedAll(errors) : make.passed(record);
|
|
2594
2630
|
};
|
|
2595
2631
|
})(Validation || (Validation = {}));
|
|
2596
|
-
|
|
2597
2632
|
export {
|
|
2598
2633
|
Combinable,
|
|
2599
2634
|
Deferred,
|
|
@@ -2614,7 +2649,6 @@ export {
|
|
|
2614
2649
|
Result,
|
|
2615
2650
|
State,
|
|
2616
2651
|
Stream,
|
|
2617
|
-
isNonEmptyArr,
|
|
2618
2652
|
Task,
|
|
2619
2653
|
These,
|
|
2620
2654
|
Validation
|
package/dist/data.cjs
CHANGED
|
@@ -475,7 +475,7 @@ var Arr;
|
|
|
475
475
|
}
|
|
476
476
|
return result;
|
|
477
477
|
};
|
|
478
|
-
Arr2.uniq = (data) => [...new Set(data)];
|
|
478
|
+
Arr2.uniq = (data) => data.length <= 1 ? data : [...new Set(data)];
|
|
479
479
|
Arr2.uniqBy = (f) => (data) => {
|
|
480
480
|
const seen = /* @__PURE__ */ new Set();
|
|
481
481
|
const result = [];
|
|
@@ -1130,10 +1130,20 @@ var Num;
|
|
|
1130
1130
|
|
|
1131
1131
|
// src/Data/Rec.ts
|
|
1132
1132
|
var _isNonEmpty = (data) => Object.keys(data).length > 0;
|
|
1133
|
+
var _setKey = (record, key, value) => {
|
|
1134
|
+
if (key === "__proto__") {
|
|
1135
|
+
Object.defineProperty(record, key, { value, writable: true, enumerable: true, configurable: true });
|
|
1136
|
+
} else {
|
|
1137
|
+
record[key] = value;
|
|
1138
|
+
}
|
|
1139
|
+
};
|
|
1133
1140
|
var RecMaybe;
|
|
1134
1141
|
((RecMaybe2) => {
|
|
1135
1142
|
RecMaybe2.traverse = (f) => (data) => {
|
|
1136
1143
|
const recordKeys = Object.keys(data);
|
|
1144
|
+
if (recordKeys.length === 0) {
|
|
1145
|
+
return { kind: "Some", value: {} };
|
|
1146
|
+
}
|
|
1137
1147
|
const result = {};
|
|
1138
1148
|
for (let i = 0; i < recordKeys.length; i++) {
|
|
1139
1149
|
const key = recordKeys[i];
|
|
@@ -1141,7 +1151,7 @@ var RecMaybe;
|
|
|
1141
1151
|
if (maybeVal.kind === "None") {
|
|
1142
1152
|
return maybeVal;
|
|
1143
1153
|
}
|
|
1144
|
-
|
|
1154
|
+
_setKey(result, key, maybeVal.value);
|
|
1145
1155
|
}
|
|
1146
1156
|
return { kind: "Some", value: result };
|
|
1147
1157
|
};
|
|
@@ -1158,7 +1168,7 @@ var RecResult;
|
|
|
1158
1168
|
if (res.kind === "Err") {
|
|
1159
1169
|
return res;
|
|
1160
1170
|
}
|
|
1161
|
-
|
|
1171
|
+
_setKey(result, key, res.value);
|
|
1162
1172
|
}
|
|
1163
1173
|
return { kind: "Ok", value: result };
|
|
1164
1174
|
};
|
|
@@ -1211,12 +1221,7 @@ var Rec;
|
|
|
1211
1221
|
for (let i = 0; i < recordKeys.length; i++) {
|
|
1212
1222
|
const maybeVal = f(recordValues[i]);
|
|
1213
1223
|
if (maybeVal.kind === "Some") {
|
|
1214
|
-
|
|
1215
|
-
value: maybeVal.value,
|
|
1216
|
-
writable: true,
|
|
1217
|
-
enumerable: true,
|
|
1218
|
-
configurable: true
|
|
1219
|
-
});
|
|
1224
|
+
_setKey(result, recordKeys[i], maybeVal.value);
|
|
1220
1225
|
}
|
|
1221
1226
|
}
|
|
1222
1227
|
return result;
|
|
@@ -1227,16 +1232,7 @@ var Rec;
|
|
|
1227
1232
|
const result = Object.create(Object.getPrototypeOf(data));
|
|
1228
1233
|
for (let i = 0; i < recordKeys.length; i++) {
|
|
1229
1234
|
const key = recordKeys[i];
|
|
1230
|
-
|
|
1231
|
-
Object.defineProperty(result, "__proto__", {
|
|
1232
|
-
value: f(key, recordValues[i]),
|
|
1233
|
-
writable: true,
|
|
1234
|
-
enumerable: true,
|
|
1235
|
-
configurable: true
|
|
1236
|
-
});
|
|
1237
|
-
} else {
|
|
1238
|
-
result[key] = f(key, recordValues[i]);
|
|
1239
|
-
}
|
|
1235
|
+
_setKey(result, key, f(key, recordValues[i]));
|
|
1240
1236
|
}
|
|
1241
1237
|
return result;
|
|
1242
1238
|
};
|
|
@@ -1246,12 +1242,7 @@ var Rec;
|
|
|
1246
1242
|
const result = Object.create(Object.getPrototypeOf(data));
|
|
1247
1243
|
for (let i = 0; i < recordKeys.length; i++) {
|
|
1248
1244
|
if (predicate(recordValues[i])) {
|
|
1249
|
-
|
|
1250
|
-
value: recordValues[i],
|
|
1251
|
-
writable: true,
|
|
1252
|
-
enumerable: true,
|
|
1253
|
-
configurable: true
|
|
1254
|
-
});
|
|
1245
|
+
_setKey(result, recordKeys[i], recordValues[i]);
|
|
1255
1246
|
}
|
|
1256
1247
|
}
|
|
1257
1248
|
return result;
|
|
@@ -1260,7 +1251,7 @@ var Rec;
|
|
|
1260
1251
|
const result = {};
|
|
1261
1252
|
for (const [k, v] of Object.entries(data)) {
|
|
1262
1253
|
if (predicate(k, v)) {
|
|
1263
|
-
|
|
1254
|
+
_setKey(result, k, v);
|
|
1264
1255
|
}
|
|
1265
1256
|
}
|
|
1266
1257
|
return result;
|
|
@@ -1280,7 +1271,7 @@ var Rec;
|
|
|
1280
1271
|
if (Object.hasOwn(result, key)) {
|
|
1281
1272
|
result[key].push(item);
|
|
1282
1273
|
} else {
|
|
1283
|
-
|
|
1274
|
+
_setKey(result, key, [item]);
|
|
1284
1275
|
}
|
|
1285
1276
|
}
|
|
1286
1277
|
return result;
|
|
@@ -1289,7 +1280,7 @@ var Rec;
|
|
|
1289
1280
|
const result = {};
|
|
1290
1281
|
for (const key of pickedKeys) {
|
|
1291
1282
|
if (Object.hasOwn(data, key)) {
|
|
1292
|
-
|
|
1283
|
+
_setKey(result, key, data[key]);
|
|
1293
1284
|
}
|
|
1294
1285
|
}
|
|
1295
1286
|
return result;
|
|
@@ -1299,12 +1290,7 @@ var Rec;
|
|
|
1299
1290
|
const result = {};
|
|
1300
1291
|
for (const key of Object.keys(data)) {
|
|
1301
1292
|
if (!omitSet.has(key)) {
|
|
1302
|
-
|
|
1303
|
-
value: data[key],
|
|
1304
|
-
writable: true,
|
|
1305
|
-
enumerable: true,
|
|
1306
|
-
configurable: true
|
|
1307
|
-
});
|
|
1293
|
+
_setKey(result, key, data[key]);
|
|
1308
1294
|
}
|
|
1309
1295
|
}
|
|
1310
1296
|
return result;
|
|
@@ -1345,26 +1331,42 @@ var Rec;
|
|
|
1345
1331
|
Rec2.mergeWith = mergeWith;
|
|
1346
1332
|
Rec2.size = (data) => Object.keys(data).length;
|
|
1347
1333
|
Rec2.mapKeys = (f) => (data) => {
|
|
1334
|
+
const keys2 = Object.keys(data);
|
|
1335
|
+
if (keys2.length === 0) {
|
|
1336
|
+
return data;
|
|
1337
|
+
}
|
|
1348
1338
|
const result = {};
|
|
1349
|
-
for (
|
|
1350
|
-
|
|
1339
|
+
for (let i = 0; i < keys2.length; i++) {
|
|
1340
|
+
const k = keys2[i];
|
|
1341
|
+
_setKey(result, f(k), data[k]);
|
|
1351
1342
|
}
|
|
1352
1343
|
return result;
|
|
1353
1344
|
};
|
|
1354
1345
|
Rec2.compact = (data) => {
|
|
1346
|
+
const keys2 = Object.keys(data);
|
|
1347
|
+
if (keys2.length === 0) {
|
|
1348
|
+
return {};
|
|
1349
|
+
}
|
|
1355
1350
|
const result = {};
|
|
1356
|
-
for (
|
|
1351
|
+
for (let i = 0; i < keys2.length; i++) {
|
|
1352
|
+
const k = keys2[i];
|
|
1353
|
+
const v = data[k];
|
|
1357
1354
|
if (v.kind === "Some") {
|
|
1358
|
-
|
|
1355
|
+
_setKey(result, k, v.value);
|
|
1359
1356
|
}
|
|
1360
1357
|
}
|
|
1361
1358
|
return result;
|
|
1362
1359
|
};
|
|
1363
1360
|
Rec2.mapEntries = (f) => (data) => {
|
|
1361
|
+
const keys2 = Object.keys(data);
|
|
1362
|
+
if (keys2.length === 0) {
|
|
1363
|
+
return {};
|
|
1364
|
+
}
|
|
1364
1365
|
const result = {};
|
|
1365
|
-
for (
|
|
1366
|
-
const
|
|
1367
|
-
|
|
1366
|
+
for (let i = 0; i < keys2.length; i++) {
|
|
1367
|
+
const k = keys2[i];
|
|
1368
|
+
const [newKey, newVal] = f(k, data[k]);
|
|
1369
|
+
_setKey(result, newKey, newVal);
|
|
1368
1370
|
}
|
|
1369
1371
|
return result;
|
|
1370
1372
|
};
|
|
@@ -1436,8 +1438,11 @@ var Str;
|
|
|
1436
1438
|
* ```
|
|
1437
1439
|
*/
|
|
1438
1440
|
int: (s) => {
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
+
if (s.length === 0) {
|
|
1442
|
+
return Maybe.make.none();
|
|
1443
|
+
}
|
|
1444
|
+
const n = Number.parseInt(s, 10);
|
|
1445
|
+
return Number.isNaN(n) ? Maybe.make.none() : Maybe.make.some(n);
|
|
1441
1446
|
},
|
|
1442
1447
|
/**
|
|
1443
1448
|
* Parses a string as a floating-point number. Returns `None` if the result is `NaN`.
|
|
@@ -1450,8 +1455,11 @@ var Str;
|
|
|
1450
1455
|
* ```
|
|
1451
1456
|
*/
|
|
1452
1457
|
float: (s) => {
|
|
1453
|
-
|
|
1454
|
-
|
|
1458
|
+
if (s.length === 0) {
|
|
1459
|
+
return Maybe.make.none();
|
|
1460
|
+
}
|
|
1461
|
+
const n = Number.parseFloat(s);
|
|
1462
|
+
return Number.isNaN(n) ? Maybe.make.none() : Maybe.make.some(n);
|
|
1455
1463
|
}
|
|
1456
1464
|
};
|
|
1457
1465
|
Str2.parseJson = (s) => {
|