@nlozgachev/pipelined 0.30.0 → 0.32.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/index.js CHANGED
@@ -22,14 +22,18 @@ var src_exports = {};
22
22
  __export(src_exports, {
23
23
  Arr: () => Arr,
24
24
  Brand: () => Brand,
25
+ Combinable: () => Combinable,
25
26
  Deferred: () => Deferred,
26
27
  Dict: () => Dict,
28
+ Equality: () => Equality,
29
+ Lazy: () => Lazy,
27
30
  Lens: () => Lens,
28
31
  Logged: () => Logged,
29
32
  Maybe: () => Maybe,
30
33
  Num: () => Num,
31
34
  Op: () => Op,
32
35
  Optional: () => Optional,
36
+ Ordering: () => Ordering,
33
37
  Predicate: () => Predicate,
34
38
  Reader: () => Reader,
35
39
  Rec: () => Rec,
@@ -288,65 +292,6 @@ function uncurry(f) {
288
292
  var uncurry3 = (f) => (a, b, c) => f(a)(b)(c);
289
293
  var uncurry4 = (f) => (a, b, c, d) => f(a)(b)(c)(d);
290
294
 
291
- // src/Core/Deferred.ts
292
- var Deferred;
293
- ((Deferred2) => {
294
- Deferred2.fromPromise = (p) => (
295
- // eslint-disable-next-line unicorn/no-thenable -- Deferred is intentionally thenable; it is the mechanism that makes Task awaitable
296
- { then: ((f) => p.then(f)) }
297
- );
298
- Deferred2.toPromise = (d) => new Promise((resolve) => d.then(resolve));
299
- })(Deferred || (Deferred = {}));
300
-
301
- // src/Core/Lens.ts
302
- var Lens;
303
- ((Lens2) => {
304
- Lens2.make = (get2, set2) => ({ get: get2, set: set2 });
305
- Lens2.prop = () => (key) => (0, Lens2.make)(
306
- (s) => s[key],
307
- (a) => (s) => ({ ...s, [key]: a })
308
- );
309
- Lens2.get = (lens) => (s) => lens.get(s);
310
- Lens2.set = (lens) => (a) => (s) => lens.set(a)(s);
311
- Lens2.modify = (lens) => (f) => (s) => lens.set(f(lens.get(s)))(s);
312
- Lens2.andThen = (inner) => (outer) => (0, Lens2.make)(
313
- (s) => inner.get(outer.get(s)),
314
- (b) => (s) => outer.set(inner.set(b)(outer.get(s)))(s)
315
- );
316
- Lens2.andThenOptional = (inner) => (outer) => ({
317
- get: (s) => inner.get(outer.get(s)),
318
- set: (b) => (s) => outer.set(inner.set(b)(outer.get(s)))(s)
319
- });
320
- Lens2.toOptional = (lens) => ({
321
- get: (s) => ({ kind: "Some", value: lens.get(s) }),
322
- set: lens.set
323
- });
324
- })(Lens || (Lens = {}));
325
-
326
- // src/Core/Logged.ts
327
- var Logged;
328
- ((Logged2) => {
329
- Logged2.make = (value) => ({ value, log: [] });
330
- Logged2.tell = (entry) => ({ value: void 0, log: [entry] });
331
- Logged2.map = (f) => (data) => ({
332
- value: f(data.value),
333
- log: data.log
334
- });
335
- Logged2.chain = (f) => (data) => {
336
- const next = f(data.value);
337
- return { value: next.value, log: [...data.log, ...next.log] };
338
- };
339
- Logged2.ap = (arg) => (data) => ({
340
- value: data.value(arg.value),
341
- log: [...data.log, ...arg.log]
342
- });
343
- Logged2.tap = (f) => (data) => {
344
- f(data.value);
345
- return data;
346
- };
347
- Logged2.run = (data) => [data.value, data.log];
348
- })(Logged || (Logged = {}));
349
-
350
295
  // src/Core/Result.ts
351
296
  var Result;
352
297
  ((Result2) => {
@@ -410,6 +355,137 @@ var Maybe;
410
355
  Maybe2.ap = (arg) => (data) => (0, Maybe2.isSome)(data) && (0, Maybe2.isSome)(arg) ? (0, Maybe2.some)(data.value(arg.value)) : (0, Maybe2.none)();
411
356
  })(Maybe || (Maybe = {}));
412
357
 
358
+ // src/Core/Combinable.ts
359
+ var Combinable;
360
+ ((Combinable2) => {
361
+ Combinable2.string = {
362
+ empty: "",
363
+ combine: (b) => (a) => a + b
364
+ };
365
+ Combinable2.sum = {
366
+ empty: 0,
367
+ combine: (b) => (a) => a + b
368
+ };
369
+ Combinable2.product = {
370
+ empty: 1,
371
+ combine: (b) => (a) => a * b
372
+ };
373
+ Combinable2.all = {
374
+ empty: true,
375
+ combine: (b) => (a) => a && b
376
+ };
377
+ Combinable2.any = {
378
+ empty: false,
379
+ combine: (b) => (a) => a || b
380
+ };
381
+ Combinable2.array = () => ({
382
+ empty: [],
383
+ combine: (b) => (a) => [...a, ...b]
384
+ });
385
+ Combinable2.maybe = (inner) => ({
386
+ empty: Maybe.none(),
387
+ combine: (b) => (a) => Maybe.isNone(a) ? b : Maybe.isNone(b) ? a : Maybe.some(inner.combine(b.value)(a.value))
388
+ });
389
+ Combinable2.fold = (c) => (data) => data.reduce((acc, x) => c.combine(x)(acc), c.empty);
390
+ })(Combinable || (Combinable = {}));
391
+
392
+ // src/Core/Deferred.ts
393
+ var Deferred;
394
+ ((Deferred2) => {
395
+ Deferred2.fromPromise = (p) => (
396
+ // eslint-disable-next-line unicorn/no-thenable -- Deferred is intentionally thenable; it is the mechanism that makes Task awaitable
397
+ { then: ((f) => p.then(f)) }
398
+ );
399
+ Deferred2.toPromise = (d) => new Promise((resolve) => d.then(resolve));
400
+ })(Deferred || (Deferred = {}));
401
+
402
+ // src/Core/Equality.ts
403
+ var Equality;
404
+ ((Equality2) => {
405
+ Equality2.string = (a, b) => a === b;
406
+ Equality2.number = (a, b) => a === b;
407
+ Equality2.boolean = (a, b) => a === b;
408
+ Equality2.date = (a, b) => a.getTime() === b.getTime();
409
+ Equality2.array = (eq) => (a, b) => a.length === b.length && a.every((x, i) => eq(x, b[i]));
410
+ Equality2.by = (f) => (eq) => (a, b) => eq(f(a), f(b));
411
+ Equality2.and = (eq2) => (eq1) => (a, b) => eq1(a, b) && eq2(a, b);
412
+ })(Equality || (Equality = {}));
413
+
414
+ // src/Core/Lazy.ts
415
+ var Lazy;
416
+ ((Lazy2) => {
417
+ Lazy2.from = (f) => {
418
+ let done = false;
419
+ let cache;
420
+ return {
421
+ get: () => {
422
+ if (!done) {
423
+ cache = f();
424
+ done = true;
425
+ }
426
+ return cache;
427
+ }
428
+ };
429
+ };
430
+ Lazy2.evaluate = (lazy) => lazy.get();
431
+ Lazy2.map = (f) => (lazy) => Lazy2.from(() => f(lazy.get()));
432
+ Lazy2.chain = (f) => (lazy) => Lazy2.from(() => f(lazy.get()).get());
433
+ Lazy2.tap = (f) => (lazy) => Lazy2.from(() => {
434
+ const v = lazy.get();
435
+ f(v);
436
+ return v;
437
+ });
438
+ })(Lazy || (Lazy = {}));
439
+
440
+ // src/Core/Lens.ts
441
+ var Lens;
442
+ ((Lens2) => {
443
+ Lens2.make = (get2, set2) => ({ get: get2, set: set2 });
444
+ Lens2.prop = () => (key) => (0, Lens2.make)(
445
+ (s) => s[key],
446
+ (a) => (s) => ({ ...s, [key]: a })
447
+ );
448
+ Lens2.get = (lens) => (s) => lens.get(s);
449
+ Lens2.set = (lens) => (a) => (s) => lens.set(a)(s);
450
+ Lens2.modify = (lens) => (f) => (s) => lens.set(f(lens.get(s)))(s);
451
+ Lens2.andThen = (inner) => (outer) => (0, Lens2.make)(
452
+ (s) => inner.get(outer.get(s)),
453
+ (b) => (s) => outer.set(inner.set(b)(outer.get(s)))(s)
454
+ );
455
+ Lens2.andThenOptional = (inner) => (outer) => ({
456
+ get: (s) => inner.get(outer.get(s)),
457
+ set: (b) => (s) => outer.set(inner.set(b)(outer.get(s)))(s)
458
+ });
459
+ Lens2.toOptional = (lens) => ({
460
+ get: (s) => ({ kind: "Some", value: lens.get(s) }),
461
+ set: lens.set
462
+ });
463
+ })(Lens || (Lens = {}));
464
+
465
+ // src/Core/Logged.ts
466
+ var Logged;
467
+ ((Logged2) => {
468
+ Logged2.make = (value) => ({ value, log: [] });
469
+ Logged2.tell = (entry) => ({ value: void 0, log: [entry] });
470
+ Logged2.map = (f) => (data) => ({
471
+ value: f(data.value),
472
+ log: data.log
473
+ });
474
+ Logged2.chain = (f) => (data) => {
475
+ const next = f(data.value);
476
+ return { value: next.value, log: [...data.log, ...next.log] };
477
+ };
478
+ Logged2.ap = (arg) => (data) => ({
479
+ value: data.value(arg.value),
480
+ log: [...data.log, ...arg.log]
481
+ });
482
+ Logged2.tap = (f) => (data) => {
483
+ f(data.value);
484
+ return data;
485
+ };
486
+ Logged2.run = (data) => [data.value, data.log];
487
+ })(Logged || (Logged = {}));
488
+
413
489
  // src/internal/Op.util.ts
414
490
  var _abortedNil = { kind: "OpNil", reason: "aborted" };
415
491
  var _droppedNil = { kind: "OpNil", reason: "dropped" };
@@ -1312,10 +1388,6 @@ var Op;
1312
1388
  Op2.wire = (source, f) => source.subscribe((state) => {
1313
1389
  if ((0, Op2.isOk)(state)) f(state.value);
1314
1390
  });
1315
- Op2.wireAll = (...pairs) => {
1316
- const cleanups = pairs.map(([source, f]) => (0, Op2.wire)(source, f));
1317
- return () => cleanups.forEach((c) => c());
1318
- };
1319
1391
  function interpret(op, options) {
1320
1392
  const { strategy, retry: retryOptions, timeout: timeoutOptions } = options;
1321
1393
  switch (strategy) {
@@ -1416,6 +1488,20 @@ var Optional;
1416
1488
  );
1417
1489
  })(Optional || (Optional = {}));
1418
1490
 
1491
+ // src/Core/Ordering.ts
1492
+ var Ordering;
1493
+ ((Ordering2) => {
1494
+ Ordering2.string = (a, b) => a < b ? -1 : a > b ? 1 : 0;
1495
+ Ordering2.number = (a, b) => a - b;
1496
+ Ordering2.date = (a, b) => a.getTime() - b.getTime();
1497
+ Ordering2.reverse = (ord) => (a, b) => ord(b, a);
1498
+ Ordering2.thenBy = (ord2) => (ord1) => (a, b) => {
1499
+ const r = ord1(a, b);
1500
+ return r !== 0 ? r : ord2(a, b);
1501
+ };
1502
+ Ordering2.by = (f) => (ord) => (a, b) => ord(f(a), f(b));
1503
+ })(Ordering || (Ordering = {}));
1504
+
1419
1505
  // src/Core/Predicate.ts
1420
1506
  var Predicate;
1421
1507
  ((Predicate2) => {
@@ -1554,58 +1640,135 @@ var Task;
1554
1640
  (signal) => Promise.all(tasks.map((t) => toPromise(t, signal)))
1555
1641
  );
1556
1642
  Task2.delay = (ms) => (data) => (0, Task2.from)(
1557
- (signal) => new Promise(
1558
- (resolve2) => setTimeout(
1559
- () => toPromise(data, signal).then(resolve2),
1560
- ms
1561
- )
1562
- )
1643
+ (signal) => new Promise((resolve2) => {
1644
+ let timerId = void 0;
1645
+ const onAbort = () => {
1646
+ if (timerId !== void 0) {
1647
+ clearTimeout(timerId);
1648
+ }
1649
+ resolve2(toPromise(data, signal));
1650
+ };
1651
+ if (signal) {
1652
+ if (signal.aborted) {
1653
+ return resolve2(toPromise(data, signal));
1654
+ }
1655
+ signal.addEventListener("abort", onAbort, { once: true });
1656
+ }
1657
+ timerId = setTimeout(() => {
1658
+ signal?.removeEventListener("abort", onAbort);
1659
+ resolve2(toPromise(data, signal));
1660
+ }, ms);
1661
+ })
1563
1662
  );
1564
1663
  Task2.repeat = (options) => (task) => (0, Task2.from)((signal) => {
1565
1664
  const { times, delay: ms } = options;
1566
1665
  if (times <= 0) return Promise.resolve([]);
1567
1666
  const results = [];
1568
- const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
1569
- const run2 = (left) => toPromise(task, signal).then((a) => {
1570
- results.push(a);
1571
- if (left <= 1) return results;
1572
- return wait().then(() => run2(left - 1));
1573
- });
1667
+ const wait = () => {
1668
+ if (signal?.aborted) return Promise.resolve();
1669
+ return new Promise((r) => {
1670
+ let timerId = void 0;
1671
+ const onAbort = () => {
1672
+ if (timerId !== void 0) {
1673
+ clearTimeout(timerId);
1674
+ }
1675
+ r();
1676
+ };
1677
+ if (signal) {
1678
+ signal.addEventListener("abort", onAbort, { once: true });
1679
+ }
1680
+ timerId = setTimeout(() => {
1681
+ signal?.removeEventListener("abort", onAbort);
1682
+ r();
1683
+ }, ms || 0);
1684
+ });
1685
+ };
1686
+ const run2 = (left) => {
1687
+ if (signal?.aborted) {
1688
+ return Promise.resolve(results);
1689
+ }
1690
+ return toPromise(task, signal).then((a) => {
1691
+ results.push(a);
1692
+ if (left <= 1 || signal?.aborted) return results;
1693
+ return wait().then(() => run2(left - 1));
1694
+ });
1695
+ };
1574
1696
  return run2(times);
1575
1697
  });
1576
1698
  Task2.repeatUntil = (options) => (task) => (0, Task2.from)((signal) => {
1577
1699
  const { when: predicate, delay: ms, maxAttempts } = options;
1578
- const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
1579
- const run2 = (attempt) => toPromise(task, signal).then((a) => {
1580
- if (predicate(a)) return a;
1581
- if (maxAttempts !== void 0 && attempt >= maxAttempts) return a;
1582
- return wait().then(() => run2(attempt + 1));
1583
- });
1700
+ const wait = () => {
1701
+ if (signal?.aborted) return Promise.resolve();
1702
+ return new Promise((r) => {
1703
+ let timerId = void 0;
1704
+ const onAbort = () => {
1705
+ if (timerId !== void 0) {
1706
+ clearTimeout(timerId);
1707
+ }
1708
+ r();
1709
+ };
1710
+ if (signal) {
1711
+ signal.addEventListener("abort", onAbort, { once: true });
1712
+ }
1713
+ timerId = setTimeout(() => {
1714
+ signal?.removeEventListener("abort", onAbort);
1715
+ r();
1716
+ }, ms || 0);
1717
+ });
1718
+ };
1719
+ const run2 = (attempt, lastValue) => {
1720
+ if (signal?.aborted && lastValue !== void 0) {
1721
+ return Promise.resolve(lastValue);
1722
+ }
1723
+ return toPromise(task, signal).then((a) => {
1724
+ if (predicate(a)) return a;
1725
+ if (maxAttempts !== void 0 && attempt >= maxAttempts) return a;
1726
+ if (signal?.aborted) return a;
1727
+ return wait().then(() => run2(attempt + 1, a));
1728
+ });
1729
+ };
1584
1730
  return run2(1);
1585
1731
  });
1586
1732
  Task2.race = (tasks) => (0, Task2.from)((signal) => Promise.race(tasks.map((t) => toPromise(t, signal))));
1587
1733
  Task2.sequential = (tasks) => (0, Task2.from)(async (signal) => {
1588
1734
  const results = [];
1589
1735
  for (const task of tasks) {
1736
+ if (signal?.aborted) {
1737
+ break;
1738
+ }
1590
1739
  results.push(await toPromise(task, signal));
1591
1740
  }
1592
1741
  return results;
1593
1742
  });
1594
1743
  Task2.timeout = (ms, onTimeout) => (task) => (0, Task2.from)((outerSignal) => {
1595
1744
  const controller = new AbortController();
1596
- const onOuterAbort = () => controller.abort();
1597
- outerSignal?.addEventListener("abort", onOuterAbort, { once: true });
1598
1745
  let timerId;
1746
+ const cleanUp = () => {
1747
+ if (timerId !== void 0) {
1748
+ clearTimeout(timerId);
1749
+ }
1750
+ outerSignal?.removeEventListener("abort", onOuterAbort);
1751
+ };
1752
+ const onOuterAbort = () => {
1753
+ cleanUp();
1754
+ controller.abort();
1755
+ };
1756
+ if (outerSignal) {
1757
+ if (outerSignal.aborted) {
1758
+ controller.abort();
1759
+ } else {
1760
+ outerSignal.addEventListener("abort", onOuterAbort, { once: true });
1761
+ }
1762
+ }
1599
1763
  return Promise.race([
1600
1764
  toPromise(task, controller.signal).then((a) => {
1601
- clearTimeout(timerId);
1602
- outerSignal?.removeEventListener("abort", onOuterAbort);
1765
+ cleanUp();
1603
1766
  return Result.ok(a);
1604
1767
  }),
1605
1768
  new Promise((resolve2) => {
1606
1769
  timerId = setTimeout(() => {
1607
1770
  controller.abort();
1608
- outerSignal?.removeEventListener("abort", onOuterAbort);
1771
+ cleanUp();
1609
1772
  resolve2(Result.error(onTimeout()));
1610
1773
  }, ms);
1611
1774
  })
@@ -1641,28 +1804,33 @@ var Resource;
1641
1804
  release
1642
1805
  });
1643
1806
  Resource2.use = (f) => (resource) => Task.from(
1644
- () => Deferred.toPromise(resource.acquire()).then(async (acquired) => {
1807
+ (signal) => Deferred.toPromise(resource.acquire(signal)).then(async (acquired) => {
1645
1808
  if (Result.isError(acquired)) return acquired;
1646
1809
  const a = acquired.value;
1647
- const usageResult = await Deferred.toPromise(f(a)());
1648
- await Deferred.toPromise(resource.release(a)());
1649
- return usageResult;
1810
+ try {
1811
+ const usageResult = await Deferred.toPromise(f(a)(signal));
1812
+ return usageResult;
1813
+ } finally {
1814
+ await Deferred.toPromise(resource.release(a)(signal));
1815
+ }
1650
1816
  })
1651
1817
  );
1652
1818
  Resource2.combine = (resourceA, resourceB) => ({
1653
1819
  acquire: Task.from(
1654
- () => Deferred.toPromise(resourceA.acquire()).then(async (acquiredA) => {
1820
+ (signal) => Deferred.toPromise(resourceA.acquire(signal)).then(async (acquiredA) => {
1655
1821
  if (Result.isError(acquiredA)) return acquiredA;
1656
1822
  const a = acquiredA.value;
1657
- const acquiredB = await Deferred.toPromise(resourceB.acquire());
1823
+ const acquiredB = await Deferred.toPromise(resourceB.acquire(signal));
1658
1824
  if (Result.isError(acquiredB)) {
1659
- await Deferred.toPromise(resourceA.release(a)());
1825
+ await Deferred.toPromise(resourceA.release(a)(signal));
1660
1826
  return acquiredB;
1661
1827
  }
1662
1828
  return Result.ok([a, acquiredB.value]);
1663
1829
  })
1664
1830
  ),
1665
- release: ([a, b]) => Task.from(() => Deferred.toPromise(resourceB.release(b)()).then(() => Deferred.toPromise(resourceA.release(a)())))
1831
+ release: ([a, b]) => Task.from(
1832
+ (signal) => Deferred.toPromise(resourceB.release(b)(signal)).then(() => Deferred.toPromise(resourceA.release(a)(signal)))
1833
+ )
1666
1834
  });
1667
1835
  })(Resource || (Resource = {}));
1668
1836
 
@@ -1705,14 +1873,14 @@ var TaskMaybe;
1705
1873
  TaskMaybe2.fromMaybe = (option) => Task.resolve(option);
1706
1874
  TaskMaybe2.fromTask = (task) => Task.map(Maybe.some)(task);
1707
1875
  TaskMaybe2.tryCatch = (f) => Task.from(
1708
- () => f().then(Maybe.some).catch(() => Maybe.none())
1876
+ (signal) => f(signal).then(Maybe.some).catch(() => Maybe.none())
1709
1877
  );
1710
1878
  TaskMaybe2.map = (f) => (data) => Task.map(Maybe.map(f))(data);
1711
1879
  TaskMaybe2.chain = (f) => (data) => Task.chain((option) => Maybe.isSome(option) ? f(option.value) : Task.resolve(Maybe.none()))(data);
1712
1880
  TaskMaybe2.ap = (arg) => (data) => Task.from(
1713
- () => Promise.all([
1714
- Deferred.toPromise(data()),
1715
- Deferred.toPromise(arg())
1881
+ (signal) => Promise.all([
1882
+ Deferred.toPromise(data(signal)),
1883
+ Deferred.toPromise(arg(signal))
1716
1884
  ]).then(([of_, oa]) => Maybe.ap(oa)(of_))
1717
1885
  );
1718
1886
  TaskMaybe2.fold = (onNone, onSome) => (data) => Task.map(Maybe.fold(onNone, onSome))(data);
@@ -1746,6 +1914,12 @@ var TaskResult;
1746
1914
  TaskResult2.getOrElse = (defaultValue) => (data) => Task.map(Result.getOrElse(defaultValue))(data);
1747
1915
  TaskResult2.tap = (f) => (data) => Task.map(Result.tap(f))(data);
1748
1916
  TaskResult2.tapError = (f) => (data) => Task.map(Result.tapError(f))(data);
1917
+ TaskResult2.ap = (arg) => (data) => Task.from(
1918
+ (signal) => Promise.all([
1919
+ Deferred.toPromise(data(signal)),
1920
+ Deferred.toPromise(arg(signal))
1921
+ ]).then(([of_, oa]) => Result.ap(oa)(of_))
1922
+ );
1749
1923
  TaskResult2.run = (signal) => (task) => Deferred.toPromise(task(signal));
1750
1924
  })(TaskResult || (TaskResult = {}));
1751
1925
 
@@ -1819,13 +1993,13 @@ var TaskValidation;
1819
1993
  TaskValidation2.invalidAll = (errors) => Task.resolve(Validation.invalidAll(errors));
1820
1994
  TaskValidation2.fromValidation = (validation) => Task.resolve(validation);
1821
1995
  TaskValidation2.tryCatch = (f, onError) => Task.from(
1822
- () => f().then(Validation.valid).catch((e) => Validation.invalid(onError(e)))
1996
+ (signal) => f(signal).then(Validation.valid).catch((e) => Validation.invalid(onError(e)))
1823
1997
  );
1824
1998
  TaskValidation2.map = (f) => (data) => Task.map(Validation.map(f))(data);
1825
1999
  TaskValidation2.ap = (arg) => (data) => Task.from(
1826
- () => Promise.all([
1827
- Deferred.toPromise(data()),
1828
- Deferred.toPromise(arg())
2000
+ (signal) => Promise.all([
2001
+ Deferred.toPromise(data(signal)),
2002
+ Deferred.toPromise(arg(signal))
1829
2003
  ]).then(([vf, va]) => Validation.ap(va)(vf))
1830
2004
  );
1831
2005
  TaskValidation2.fold = (onInvalid, onValid) => (data) => Task.map(Validation.fold(onInvalid, onValid))(data);
@@ -1836,13 +2010,13 @@ var TaskValidation;
1836
2010
  (validation) => Validation.isValid(validation) ? Task.resolve(validation) : fallback(validation.errors)
1837
2011
  )(data);
1838
2012
  TaskValidation2.product = (first, second) => Task.from(
1839
- () => Promise.all([
1840
- Deferred.toPromise(first()),
1841
- Deferred.toPromise(second())
2013
+ (signal) => Promise.all([
2014
+ Deferred.toPromise(first(signal)),
2015
+ Deferred.toPromise(second(signal))
1842
2016
  ]).then(([va, vb]) => Validation.product(va, vb))
1843
2017
  );
1844
2018
  TaskValidation2.productAll = (data) => Task.from(
1845
- () => Promise.all(data.map((t) => Deferred.toPromise(t()))).then((results) => Validation.productAll(results))
2019
+ (signal) => Promise.all(data.map((t) => Deferred.toPromise(t(signal)))).then((results) => Validation.productAll(results))
1846
2020
  );
1847
2021
  })(TaskValidation || (TaskValidation = {}));
1848
2022
 
@@ -2019,11 +2193,25 @@ var Arr;
2019
2193
  }
2020
2194
  return result;
2021
2195
  };
2196
+ Arr2.uniqWith = (eq) => (data) => {
2197
+ const result = [];
2198
+ for (const a of data) {
2199
+ if (!result.some((x) => eq(x, a))) {
2200
+ result.push(a);
2201
+ }
2202
+ }
2203
+ return result;
2204
+ };
2022
2205
  Arr2.sortBy = (compare) => (data) => {
2023
2206
  const arr = data;
2024
2207
  if (typeof arr.toSorted === "function") return arr.toSorted(compare);
2025
2208
  return [...data].sort(compare);
2026
2209
  };
2210
+ Arr2.sortWith = (ord) => (data) => {
2211
+ const arr = data;
2212
+ if (typeof arr.toSorted === "function") return arr.toSorted(ord);
2213
+ return [...data].sort(ord);
2214
+ };
2027
2215
  Arr2.zip = (other) => (data) => {
2028
2216
  const len = Math.min(data.length, other.length);
2029
2217
  const result = new Array(len);
@@ -2056,7 +2244,23 @@ var Arr;
2056
2244
  }
2057
2245
  return result;
2058
2246
  };
2059
- Arr2.flatten = (data) => [].concat(...data);
2247
+ Arr2.flatten = (data) => {
2248
+ let totalLen = 0;
2249
+ const outerLen = data.length;
2250
+ for (let i = 0; i < outerLen; i++) {
2251
+ totalLen += data[i].length;
2252
+ }
2253
+ const result = new Array(totalLen);
2254
+ let idx = 0;
2255
+ for (let i = 0; i < outerLen; i++) {
2256
+ const chunk = data[i];
2257
+ const innerLen = chunk.length;
2258
+ for (let j = 0; j < innerLen; j++) {
2259
+ result[idx++] = chunk[j];
2260
+ }
2261
+ }
2262
+ return result;
2263
+ };
2060
2264
  Arr2.flatMap = (f) => (data) => {
2061
2265
  const n = data.length;
2062
2266
  const result = [];
@@ -2295,8 +2499,8 @@ var Num;
2295
2499
  }
2296
2500
  return result;
2297
2501
  };
2298
- Num2.clamp = (min, max) => (n) => Math.min(Math.max(n, min), max);
2299
- Num2.between = (min, max) => (n) => n >= min && n <= max;
2502
+ Num2.clamp = (min2, max2) => (n) => Math.min(Math.max(n, min2), max2);
2503
+ Num2.between = (min2, max2) => (n) => n >= min2 && n <= max2;
2300
2504
  Num2.parse = (s) => {
2301
2505
  if (s.trim() === "") return Maybe.none();
2302
2506
  const n = Number(s);
@@ -2312,6 +2516,28 @@ var Num;
2312
2516
  Num2.floor = (n) => Math.floor(n);
2313
2517
  Num2.ceil = (n) => Math.ceil(n);
2314
2518
  Num2.remainder = (divisor) => (n) => divisor === 0 ? Maybe.none() : Maybe.some(n % divisor);
2519
+ Num2.sum = (ns) => {
2520
+ let result = 0;
2521
+ for (let i = 0; i < ns.length; i++) result += ns[i];
2522
+ return result;
2523
+ };
2524
+ Num2.mean = (ns) => ns.length === 0 ? Maybe.none() : Maybe.some((0, Num2.sum)(ns) / ns.length);
2525
+ Num2.min = (ns) => {
2526
+ if (ns.length === 0) return Maybe.none();
2527
+ let [result] = ns;
2528
+ for (let i = 1; i < ns.length; i++) {
2529
+ if (ns[i] < result) result = ns[i];
2530
+ }
2531
+ return Maybe.some(result);
2532
+ };
2533
+ Num2.max = (ns) => {
2534
+ if (ns.length === 0) return Maybe.none();
2535
+ let [result] = ns;
2536
+ for (let i = 1; i < ns.length; i++) {
2537
+ if (ns[i] > result) result = ns[i];
2538
+ }
2539
+ return Maybe.some(result);
2540
+ };
2315
2541
  })(Num || (Num = {}));
2316
2542
 
2317
2543
  // src/Utils/Rec.ts
@@ -2435,6 +2661,7 @@ var Str;
2435
2661
  Str2.endsWith = (suffix) => (s) => s.endsWith(suffix);
2436
2662
  Str2.toUpperCase = (s) => s.toUpperCase();
2437
2663
  Str2.toLowerCase = (s) => s.toLowerCase();
2664
+ Str2.capitalize = (s) => s.length === 0 ? "" : s.charAt(0).toUpperCase() + s.slice(1);
2438
2665
  Str2.lines = (s) => s.split(/\r?\n|\r/);
2439
2666
  Str2.words = (s) => s.trim().split(/\s+/).filter(Boolean);
2440
2667
  Str2.isEmpty = (s) => s.length === 0;
@@ -2552,14 +2779,18 @@ var Uniq;
2552
2779
  0 && (module.exports = {
2553
2780
  Arr,
2554
2781
  Brand,
2782
+ Combinable,
2555
2783
  Deferred,
2556
2784
  Dict,
2785
+ Equality,
2786
+ Lazy,
2557
2787
  Lens,
2558
2788
  Logged,
2559
2789
  Maybe,
2560
2790
  Num,
2561
2791
  Op,
2562
2792
  Optional,
2793
+ Ordering,
2563
2794
  Predicate,
2564
2795
  Reader,
2565
2796
  Rec,
package/dist/index.mjs CHANGED
@@ -28,10 +28,14 @@ import {
28
28
  uncurry4
29
29
  } from "./chunk-NRF2FVPZ.mjs";
30
30
  import {
31
+ Combinable,
32
+ Equality,
33
+ Lazy,
31
34
  Lens,
32
35
  Logged,
33
36
  Op,
34
37
  Optional,
38
+ Ordering,
35
39
  Predicate,
36
40
  Reader,
37
41
  Refinement,
@@ -44,7 +48,7 @@ import {
44
48
  These,
45
49
  Tuple,
46
50
  Validation
47
- } from "./chunk-PV7JOUKL.mjs";
51
+ } from "./chunk-L3NC44SN.mjs";
48
52
  import {
49
53
  Arr,
50
54
  Dict,
@@ -52,13 +56,13 @@ import {
52
56
  Rec,
53
57
  Str,
54
58
  Uniq
55
- } from "./chunk-FWYOEWJ2.mjs";
59
+ } from "./chunk-EHQFUWZW.mjs";
56
60
  import {
57
61
  Deferred,
58
62
  Maybe,
59
63
  Result,
60
64
  Task
61
- } from "./chunk-SDGDJ7CU.mjs";
65
+ } from "./chunk-TK5ZCGP2.mjs";
62
66
  import {
63
67
  Brand
64
68
  } from "./chunk-BYWKZLHM.mjs";
@@ -68,14 +72,18 @@ import {
68
72
  export {
69
73
  Arr,
70
74
  Brand,
75
+ Combinable,
71
76
  Deferred,
72
77
  Dict,
78
+ Equality,
79
+ Lazy,
73
80
  Lens,
74
81
  Logged,
75
82
  Maybe,
76
83
  Num,
77
84
  Op,
78
85
  Optional,
86
+ Ordering,
79
87
  Predicate,
80
88
  Reader,
81
89
  Rec,