@nlozgachev/pipelined 0.31.0 → 0.33.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,19 @@ 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
+ Duration: () => Duration,
29
+ Equality: () => Equality,
30
+ Lazy: () => Lazy,
27
31
  Lens: () => Lens,
28
32
  Logged: () => Logged,
29
33
  Maybe: () => Maybe,
30
34
  Num: () => Num,
31
35
  Op: () => Op,
32
36
  Optional: () => Optional,
37
+ Ordering: () => Ordering,
33
38
  Predicate: () => Predicate,
34
39
  Reader: () => Reader,
35
40
  Rec: () => Rec,
@@ -288,65 +293,6 @@ function uncurry(f) {
288
293
  var uncurry3 = (f) => (a, b, c) => f(a)(b)(c);
289
294
  var uncurry4 = (f) => (a, b, c, d) => f(a)(b)(c)(d);
290
295
 
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
296
  // src/Core/Result.ts
351
297
  var Result;
352
298
  ((Result2) => {
@@ -376,6 +322,15 @@ var Result;
376
322
  return data;
377
323
  };
378
324
  Result2.fromPredicate = (pred, onFalse) => (a) => pred(a) ? (0, Result2.ok)(a) : (0, Result2.error)(onFalse(a));
325
+ Result2.fromNullable = (onNull) => (value) => value === null || value === void 0 ? (0, Result2.error)(onNull()) : (0, Result2.ok)(value);
326
+ Result2.fromMaybe = (onNone) => (maybe) => Maybe.isNone(maybe) ? (0, Result2.error)(onNone()) : (0, Result2.ok)(maybe.value);
327
+ Result2.fromThrowable = (f, onError) => (...args) => {
328
+ try {
329
+ return (0, Result2.ok)(f(...args));
330
+ } catch (e) {
331
+ return (0, Result2.error)(onError(e));
332
+ }
333
+ };
379
334
  Result2.recover = (fallback) => (data) => (0, Result2.isOk)(data) ? data : fallback(data.error);
380
335
  Result2.recoverUnless = (isBlocked, fallback) => (data) => (0, Result2.isError)(data) && !isBlocked(data.error) ? fallback() : data;
381
336
  Result2.toMaybe = (data) => (0, Result2.isOk)(data) ? Maybe.some(data.value) : Maybe.none();
@@ -410,6 +365,137 @@ var Maybe;
410
365
  Maybe2.ap = (arg) => (data) => (0, Maybe2.isSome)(data) && (0, Maybe2.isSome)(arg) ? (0, Maybe2.some)(data.value(arg.value)) : (0, Maybe2.none)();
411
366
  })(Maybe || (Maybe = {}));
412
367
 
368
+ // src/Core/Combinable.ts
369
+ var Combinable;
370
+ ((Combinable2) => {
371
+ Combinable2.string = {
372
+ empty: "",
373
+ combine: (b) => (a) => a + b
374
+ };
375
+ Combinable2.sum = {
376
+ empty: 0,
377
+ combine: (b) => (a) => a + b
378
+ };
379
+ Combinable2.product = {
380
+ empty: 1,
381
+ combine: (b) => (a) => a * b
382
+ };
383
+ Combinable2.all = {
384
+ empty: true,
385
+ combine: (b) => (a) => a && b
386
+ };
387
+ Combinable2.any = {
388
+ empty: false,
389
+ combine: (b) => (a) => a || b
390
+ };
391
+ Combinable2.array = () => ({
392
+ empty: [],
393
+ combine: (b) => (a) => [...a, ...b]
394
+ });
395
+ Combinable2.maybe = (inner) => ({
396
+ empty: Maybe.none(),
397
+ combine: (b) => (a) => Maybe.isNone(a) ? b : Maybe.isNone(b) ? a : Maybe.some(inner.combine(b.value)(a.value))
398
+ });
399
+ Combinable2.fold = (c) => (data) => data.reduce((acc, x) => c.combine(x)(acc), c.empty);
400
+ })(Combinable || (Combinable = {}));
401
+
402
+ // src/Core/Deferred.ts
403
+ var Deferred;
404
+ ((Deferred2) => {
405
+ Deferred2.fromPromise = (p) => (
406
+ // eslint-disable-next-line unicorn/no-thenable -- Deferred is intentionally thenable; it is the mechanism that makes Task awaitable
407
+ { then: ((f) => p.then(f)) }
408
+ );
409
+ Deferred2.toPromise = (d) => new Promise((resolve) => d.then(resolve));
410
+ })(Deferred || (Deferred = {}));
411
+
412
+ // src/Core/Equality.ts
413
+ var Equality;
414
+ ((Equality2) => {
415
+ Equality2.string = (a, b) => a === b;
416
+ Equality2.number = (a, b) => a === b;
417
+ Equality2.boolean = (a, b) => a === b;
418
+ Equality2.date = (a, b) => a.getTime() === b.getTime();
419
+ Equality2.array = (eq) => (a, b) => a.length === b.length && a.every((x, i) => eq(x, b[i]));
420
+ Equality2.by = (f) => (eq) => (a, b) => eq(f(a), f(b));
421
+ Equality2.and = (eq2) => (eq1) => (a, b) => eq1(a, b) && eq2(a, b);
422
+ })(Equality || (Equality = {}));
423
+
424
+ // src/Core/Lazy.ts
425
+ var Lazy;
426
+ ((Lazy2) => {
427
+ Lazy2.from = (f) => {
428
+ let done = false;
429
+ let cache;
430
+ return {
431
+ get: () => {
432
+ if (!done) {
433
+ cache = f();
434
+ done = true;
435
+ }
436
+ return cache;
437
+ }
438
+ };
439
+ };
440
+ Lazy2.evaluate = (lazy) => lazy.get();
441
+ Lazy2.map = (f) => (lazy) => Lazy2.from(() => f(lazy.get()));
442
+ Lazy2.chain = (f) => (lazy) => Lazy2.from(() => f(lazy.get()).get());
443
+ Lazy2.tap = (f) => (lazy) => Lazy2.from(() => {
444
+ const v = lazy.get();
445
+ f(v);
446
+ return v;
447
+ });
448
+ })(Lazy || (Lazy = {}));
449
+
450
+ // src/Core/Lens.ts
451
+ var Lens;
452
+ ((Lens2) => {
453
+ Lens2.make = (get2, set2) => ({ get: get2, set: set2 });
454
+ Lens2.prop = () => (key) => (0, Lens2.make)(
455
+ (s) => s[key],
456
+ (a) => (s) => ({ ...s, [key]: a })
457
+ );
458
+ Lens2.get = (lens) => (s) => lens.get(s);
459
+ Lens2.set = (lens) => (a) => (s) => lens.set(a)(s);
460
+ Lens2.modify = (lens) => (f) => (s) => lens.set(f(lens.get(s)))(s);
461
+ Lens2.andThen = (inner) => (outer) => (0, Lens2.make)(
462
+ (s) => inner.get(outer.get(s)),
463
+ (b) => (s) => outer.set(inner.set(b)(outer.get(s)))(s)
464
+ );
465
+ Lens2.andThenOptional = (inner) => (outer) => ({
466
+ get: (s) => inner.get(outer.get(s)),
467
+ set: (b) => (s) => outer.set(inner.set(b)(outer.get(s)))(s)
468
+ });
469
+ Lens2.toOptional = (lens) => ({
470
+ get: (s) => ({ kind: "Some", value: lens.get(s) }),
471
+ set: lens.set
472
+ });
473
+ })(Lens || (Lens = {}));
474
+
475
+ // src/Core/Logged.ts
476
+ var Logged;
477
+ ((Logged2) => {
478
+ Logged2.make = (value) => ({ value, log: [] });
479
+ Logged2.tell = (entry) => ({ value: void 0, log: [entry] });
480
+ Logged2.map = (f) => (data) => ({
481
+ value: f(data.value),
482
+ log: data.log
483
+ });
484
+ Logged2.chain = (f) => (data) => {
485
+ const next = f(data.value);
486
+ return { value: next.value, log: [...data.log, ...next.log] };
487
+ };
488
+ Logged2.ap = (arg) => (data) => ({
489
+ value: data.value(arg.value),
490
+ log: [...data.log, ...arg.log]
491
+ });
492
+ Logged2.tap = (f) => (data) => {
493
+ f(data.value);
494
+ return data;
495
+ };
496
+ Logged2.run = (data) => [data.value, data.log];
497
+ })(Logged || (Logged = {}));
498
+
413
499
  // src/internal/Op.util.ts
414
500
  var _abortedNil = { kind: "OpNil", reason: "aborted" };
415
501
  var _droppedNil = { kind: "OpNil", reason: "dropped" };
@@ -1412,6 +1498,20 @@ var Optional;
1412
1498
  );
1413
1499
  })(Optional || (Optional = {}));
1414
1500
 
1501
+ // src/Core/Ordering.ts
1502
+ var Ordering;
1503
+ ((Ordering2) => {
1504
+ Ordering2.string = (a, b) => a < b ? -1 : a > b ? 1 : 0;
1505
+ Ordering2.number = (a, b) => a - b;
1506
+ Ordering2.date = (a, b) => a.getTime() - b.getTime();
1507
+ Ordering2.reverse = (ord) => (a, b) => ord(b, a);
1508
+ Ordering2.thenBy = (ord2) => (ord1) => (a, b) => {
1509
+ const r = ord1(a, b);
1510
+ return r !== 0 ? r : ord2(a, b);
1511
+ };
1512
+ Ordering2.by = (f) => (ord) => (a, b) => ord(f(a), f(b));
1513
+ })(Ordering || (Ordering = {}));
1514
+
1415
1515
  // src/Core/Predicate.ts
1416
1516
  var Predicate;
1417
1517
  ((Predicate2) => {
@@ -1525,8 +1625,34 @@ var RemoteData;
1525
1625
  RemoteData2.filter = (pred, onFalse) => (data) => (0, RemoteData2.isSuccess)(data) ? pred(data.value) ? data : (0, RemoteData2.failure)(onFalse(data.value)) : data;
1526
1626
  })(RemoteData || (RemoteData = {}));
1527
1627
 
1628
+ // src/Types/Brand.ts
1629
+ var Brand;
1630
+ ((Brand2) => {
1631
+ Brand2.wrap = () => (value) => value;
1632
+ Brand2.unwrap = (branded) => branded;
1633
+ })(Brand || (Brand = {}));
1634
+
1635
+ // src/Types/Duration.ts
1636
+ var Duration;
1637
+ ((Duration2) => {
1638
+ const wrap = Brand.wrap();
1639
+ Duration2.milliseconds = (ms) => wrap(ms);
1640
+ Duration2.seconds = (s) => wrap(s * 1e3);
1641
+ Duration2.minutes = (m) => wrap(m * 60 * 1e3);
1642
+ Duration2.hours = (h) => wrap(h * 60 * 60 * 1e3);
1643
+ Duration2.days = (d) => wrap(d * 24 * 60 * 60 * 1e3);
1644
+ Duration2.toMilliseconds = (d) => Brand.unwrap(d);
1645
+ Duration2.toSeconds = (d) => Brand.unwrap(d) / 1e3;
1646
+ Duration2.toMinutes = (d) => Brand.unwrap(d) / (60 * 1e3);
1647
+ Duration2.toHours = (d) => Brand.unwrap(d) / (60 * 60 * 1e3);
1648
+ Duration2.toDays = (d) => Brand.unwrap(d) / (24 * 60 * 60 * 1e3);
1649
+ Duration2.add = (other) => (self) => wrap(Brand.unwrap(self) + Brand.unwrap(other));
1650
+ Duration2.subtract = (other) => (self) => wrap(Brand.unwrap(self) - Brand.unwrap(other));
1651
+ })(Duration || (Duration = {}));
1652
+
1528
1653
  // src/Core/Task.ts
1529
1654
  var toPromise = (task, signal) => Deferred.toPromise(task(signal));
1655
+ var getMs = (ms) => typeof ms === "number" ? ms : Duration.toMilliseconds(ms);
1530
1656
  var Task;
1531
1657
  ((Task2) => {
1532
1658
  Task2.resolve = (value) => () => Deferred.fromPromise(Promise.resolve(value));
@@ -1550,60 +1676,169 @@ var Task;
1550
1676
  (signal) => Promise.all(tasks.map((t) => toPromise(t, signal)))
1551
1677
  );
1552
1678
  Task2.delay = (ms) => (data) => (0, Task2.from)(
1553
- (signal) => new Promise(
1554
- (resolve2) => setTimeout(
1555
- () => toPromise(data, signal).then(resolve2),
1556
- ms
1557
- )
1558
- )
1679
+ (signal) => new Promise((resolve2) => {
1680
+ let timerId = void 0;
1681
+ const onAbort = () => {
1682
+ if (timerId !== void 0) {
1683
+ clearTimeout(timerId);
1684
+ }
1685
+ resolve2(toPromise(data, signal));
1686
+ };
1687
+ if (signal) {
1688
+ if (signal.aborted) {
1689
+ return resolve2(toPromise(data, signal));
1690
+ }
1691
+ signal.addEventListener("abort", onAbort, { once: true });
1692
+ }
1693
+ timerId = setTimeout(() => {
1694
+ signal?.removeEventListener("abort", onAbort);
1695
+ resolve2(toPromise(data, signal));
1696
+ }, getMs(ms));
1697
+ })
1559
1698
  );
1560
1699
  Task2.repeat = (options) => (task) => (0, Task2.from)((signal) => {
1561
1700
  const { times, delay: ms } = options;
1562
1701
  if (times <= 0) return Promise.resolve([]);
1563
1702
  const results = [];
1564
- const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
1565
- const run2 = (left) => toPromise(task, signal).then((a) => {
1566
- results.push(a);
1567
- if (left <= 1) return results;
1568
- return wait().then(() => run2(left - 1));
1569
- });
1703
+ const wait = () => {
1704
+ if (signal?.aborted) return Promise.resolve();
1705
+ return new Promise((r) => {
1706
+ let timerId = void 0;
1707
+ const onAbort = () => {
1708
+ if (timerId !== void 0) {
1709
+ clearTimeout(timerId);
1710
+ }
1711
+ r();
1712
+ };
1713
+ if (signal) {
1714
+ signal.addEventListener("abort", onAbort, { once: true });
1715
+ }
1716
+ timerId = setTimeout(() => {
1717
+ signal?.removeEventListener("abort", onAbort);
1718
+ r();
1719
+ }, getMs(ms || 0));
1720
+ });
1721
+ };
1722
+ const run2 = (left) => {
1723
+ if (signal?.aborted) {
1724
+ return Promise.resolve(results);
1725
+ }
1726
+ return toPromise(task, signal).then((a) => {
1727
+ results.push(a);
1728
+ if (left <= 1 || signal?.aborted) return results;
1729
+ return wait().then(() => run2(left - 1));
1730
+ });
1731
+ };
1570
1732
  return run2(times);
1571
1733
  });
1572
1734
  Task2.repeatUntil = (options) => (task) => (0, Task2.from)((signal) => {
1573
1735
  const { when: predicate, delay: ms, maxAttempts } = options;
1574
- const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
1575
- const run2 = (attempt) => toPromise(task, signal).then((a) => {
1576
- if (predicate(a)) return a;
1577
- if (maxAttempts !== void 0 && attempt >= maxAttempts) return a;
1578
- return wait().then(() => run2(attempt + 1));
1579
- });
1736
+ const wait = () => {
1737
+ if (signal?.aborted) return Promise.resolve();
1738
+ return new Promise((r) => {
1739
+ let timerId = void 0;
1740
+ const onAbort = () => {
1741
+ if (timerId !== void 0) {
1742
+ clearTimeout(timerId);
1743
+ }
1744
+ r();
1745
+ };
1746
+ if (signal) {
1747
+ signal.addEventListener("abort", onAbort, { once: true });
1748
+ }
1749
+ timerId = setTimeout(() => {
1750
+ signal?.removeEventListener("abort", onAbort);
1751
+ r();
1752
+ }, getMs(ms || 0));
1753
+ });
1754
+ };
1755
+ const run2 = (attempt, lastValue) => {
1756
+ if (signal?.aborted && lastValue !== void 0) {
1757
+ return Promise.resolve(lastValue);
1758
+ }
1759
+ return toPromise(task, signal).then((a) => {
1760
+ if (predicate(a)) return a;
1761
+ if (maxAttempts !== void 0 && attempt >= maxAttempts) return a;
1762
+ if (signal?.aborted) return a;
1763
+ return wait().then(() => run2(attempt + 1, a));
1764
+ });
1765
+ };
1580
1766
  return run2(1);
1581
1767
  });
1582
- Task2.race = (tasks) => (0, Task2.from)((signal) => Promise.race(tasks.map((t) => toPromise(t, signal))));
1768
+ Task2.race = (tasks) => {
1769
+ if (tasks.length === 0) {
1770
+ return () => Deferred.fromPromise(new Promise(() => {
1771
+ }));
1772
+ }
1773
+ return (0, Task2.from)((outerSignal) => {
1774
+ const controllers = tasks.map(() => new AbortController());
1775
+ const onOuterAbort = () => {
1776
+ for (const ctrl of controllers) ctrl.abort();
1777
+ };
1778
+ if (outerSignal) {
1779
+ if (outerSignal.aborted) {
1780
+ onOuterAbort();
1781
+ } else {
1782
+ outerSignal.addEventListener("abort", onOuterAbort, { once: true });
1783
+ }
1784
+ }
1785
+ const promises = tasks.map((task, idx) => {
1786
+ const ctrl = controllers[idx];
1787
+ return toPromise(task, ctrl.signal).then((result) => {
1788
+ for (let i = 0; i < controllers.length; i++) {
1789
+ if (i !== idx) {
1790
+ controllers[i].abort();
1791
+ }
1792
+ }
1793
+ outerSignal?.removeEventListener("abort", onOuterAbort);
1794
+ return result;
1795
+ });
1796
+ });
1797
+ return Promise.race(promises);
1798
+ });
1799
+ };
1800
+ Task2.sequence = (tasks) => (0, Task2.from)((signal) => Promise.all(tasks.map((t) => toPromise(t, signal))));
1583
1801
  Task2.sequential = (tasks) => (0, Task2.from)(async (signal) => {
1584
1802
  const results = [];
1585
1803
  for (const task of tasks) {
1804
+ if (signal?.aborted) {
1805
+ break;
1806
+ }
1586
1807
  results.push(await toPromise(task, signal));
1587
1808
  }
1588
1809
  return results;
1589
1810
  });
1590
1811
  Task2.timeout = (ms, onTimeout) => (task) => (0, Task2.from)((outerSignal) => {
1591
1812
  const controller = new AbortController();
1592
- const onOuterAbort = () => controller.abort();
1593
- outerSignal?.addEventListener("abort", onOuterAbort, { once: true });
1594
1813
  let timerId;
1814
+ const cleanUp = () => {
1815
+ if (timerId !== void 0) {
1816
+ clearTimeout(timerId);
1817
+ }
1818
+ outerSignal?.removeEventListener("abort", onOuterAbort);
1819
+ };
1820
+ const onOuterAbort = () => {
1821
+ cleanUp();
1822
+ controller.abort();
1823
+ };
1824
+ if (outerSignal) {
1825
+ if (outerSignal.aborted) {
1826
+ controller.abort();
1827
+ } else {
1828
+ outerSignal.addEventListener("abort", onOuterAbort, { once: true });
1829
+ }
1830
+ }
1595
1831
  return Promise.race([
1596
1832
  toPromise(task, controller.signal).then((a) => {
1597
- clearTimeout(timerId);
1598
- outerSignal?.removeEventListener("abort", onOuterAbort);
1833
+ cleanUp();
1599
1834
  return Result.ok(a);
1600
1835
  }),
1601
1836
  new Promise((resolve2) => {
1602
1837
  timerId = setTimeout(() => {
1603
1838
  controller.abort();
1604
- outerSignal?.removeEventListener("abort", onOuterAbort);
1839
+ cleanUp();
1605
1840
  resolve2(Result.error(onTimeout()));
1606
- }, ms);
1841
+ }, getMs(ms));
1607
1842
  })
1608
1843
  ]);
1609
1844
  });
@@ -1637,28 +1872,33 @@ var Resource;
1637
1872
  release
1638
1873
  });
1639
1874
  Resource2.use = (f) => (resource) => Task.from(
1640
- () => Deferred.toPromise(resource.acquire()).then(async (acquired) => {
1875
+ (signal) => Deferred.toPromise(resource.acquire(signal)).then(async (acquired) => {
1641
1876
  if (Result.isError(acquired)) return acquired;
1642
1877
  const a = acquired.value;
1643
- const usageResult = await Deferred.toPromise(f(a)());
1644
- await Deferred.toPromise(resource.release(a)());
1645
- return usageResult;
1878
+ try {
1879
+ const usageResult = await Deferred.toPromise(f(a)(signal));
1880
+ return usageResult;
1881
+ } finally {
1882
+ await Deferred.toPromise(resource.release(a)(signal));
1883
+ }
1646
1884
  })
1647
1885
  );
1648
1886
  Resource2.combine = (resourceA, resourceB) => ({
1649
1887
  acquire: Task.from(
1650
- () => Deferred.toPromise(resourceA.acquire()).then(async (acquiredA) => {
1888
+ (signal) => Deferred.toPromise(resourceA.acquire(signal)).then(async (acquiredA) => {
1651
1889
  if (Result.isError(acquiredA)) return acquiredA;
1652
1890
  const a = acquiredA.value;
1653
- const acquiredB = await Deferred.toPromise(resourceB.acquire());
1891
+ const acquiredB = await Deferred.toPromise(resourceB.acquire(signal));
1654
1892
  if (Result.isError(acquiredB)) {
1655
- await Deferred.toPromise(resourceA.release(a)());
1893
+ await Deferred.toPromise(resourceA.release(a)(signal));
1656
1894
  return acquiredB;
1657
1895
  }
1658
1896
  return Result.ok([a, acquiredB.value]);
1659
1897
  })
1660
1898
  ),
1661
- release: ([a, b]) => Task.from(() => Deferred.toPromise(resourceB.release(b)()).then(() => Deferred.toPromise(resourceA.release(a)())))
1899
+ release: ([a, b]) => Task.from(
1900
+ (signal) => Deferred.toPromise(resourceB.release(b)(signal)).then(() => Deferred.toPromise(resourceA.release(a)(signal)))
1901
+ )
1662
1902
  });
1663
1903
  })(Resource || (Resource = {}));
1664
1904
 
@@ -1699,16 +1939,18 @@ var TaskMaybe;
1699
1939
  TaskMaybe2.some = (value) => Task.resolve(Maybe.some(value));
1700
1940
  TaskMaybe2.none = () => Task.resolve(Maybe.none());
1701
1941
  TaskMaybe2.fromMaybe = (option) => Task.resolve(option);
1942
+ TaskMaybe2.fromNullable = (value) => Task.resolve(Maybe.fromNullable(value));
1943
+ TaskMaybe2.fromResult = (result) => Task.resolve(Result.toMaybe(result));
1702
1944
  TaskMaybe2.fromTask = (task) => Task.map(Maybe.some)(task);
1703
1945
  TaskMaybe2.tryCatch = (f) => Task.from(
1704
- () => f().then(Maybe.some).catch(() => Maybe.none())
1946
+ (signal) => f(signal).then(Maybe.some).catch(() => Maybe.none())
1705
1947
  );
1706
1948
  TaskMaybe2.map = (f) => (data) => Task.map(Maybe.map(f))(data);
1707
1949
  TaskMaybe2.chain = (f) => (data) => Task.chain((option) => Maybe.isSome(option) ? f(option.value) : Task.resolve(Maybe.none()))(data);
1708
1950
  TaskMaybe2.ap = (arg) => (data) => Task.from(
1709
- () => Promise.all([
1710
- Deferred.toPromise(data()),
1711
- Deferred.toPromise(arg())
1951
+ (signal) => Promise.all([
1952
+ Deferred.toPromise(data(signal)),
1953
+ Deferred.toPromise(arg(signal))
1712
1954
  ]).then(([of_, oa]) => Maybe.ap(oa)(of_))
1713
1955
  );
1714
1956
  TaskMaybe2.fold = (onNone, onSome) => (data) => Task.map(Maybe.fold(onNone, onSome))(data);
@@ -1724,6 +1966,12 @@ var TaskResult;
1724
1966
  ((TaskResult2) => {
1725
1967
  TaskResult2.ok = (value) => Task.resolve(Result.ok(value));
1726
1968
  TaskResult2.err = (error) => Task.resolve(Result.error(error));
1969
+ TaskResult2.fromNullable = (onNull) => (value) => Task.resolve(value === null || value === void 0 ? Result.error(onNull()) : Result.ok(value));
1970
+ TaskResult2.fromMaybe = (onNone) => (maybe) => Task.resolve(Maybe.isNone(maybe) ? Result.error(onNone()) : Result.ok(maybe.value));
1971
+ TaskResult2.fromResult = (result) => Task.resolve(result);
1972
+ TaskResult2.fromThrowable = (f, onError) => (...args) => Task.from(
1973
+ () => f(...args).then(Result.ok).catch((e) => Result.error(onError(e)))
1974
+ );
1727
1975
  TaskResult2.tryCatch = (f, onError) => Task.from(
1728
1976
  (signal) => f(signal).then(Result.ok).catch((e) => Result.error(onError(e)))
1729
1977
  );
@@ -1742,6 +1990,12 @@ var TaskResult;
1742
1990
  TaskResult2.getOrElse = (defaultValue) => (data) => Task.map(Result.getOrElse(defaultValue))(data);
1743
1991
  TaskResult2.tap = (f) => (data) => Task.map(Result.tap(f))(data);
1744
1992
  TaskResult2.tapError = (f) => (data) => Task.map(Result.tapError(f))(data);
1993
+ TaskResult2.ap = (arg) => (data) => Task.from(
1994
+ (signal) => Promise.all([
1995
+ Deferred.toPromise(data(signal)),
1996
+ Deferred.toPromise(arg(signal))
1997
+ ]).then(([of_, oa]) => Result.ap(oa)(of_))
1998
+ );
1745
1999
  TaskResult2.run = (signal) => (task) => Deferred.toPromise(task(signal));
1746
2000
  })(TaskResult || (TaskResult = {}));
1747
2001
 
@@ -1763,6 +2017,8 @@ var Validation;
1763
2017
  Validation2.isValid = (data) => data.kind === "Valid";
1764
2018
  Validation2.isInvalid = (data) => data.kind === "Invalid";
1765
2019
  Validation2.fromPredicate = (pred, onFalse) => (a) => pred(a) ? (0, Validation2.valid)(a) : (0, Validation2.invalid)(onFalse(a));
2020
+ Validation2.fromNullable = (onNull) => (value) => value === null || value === void 0 ? (0, Validation2.invalid)(onNull()) : (0, Validation2.valid)(value);
2021
+ Validation2.fromMaybe = (onNone) => (maybe) => Maybe.isNone(maybe) ? (0, Validation2.invalid)(onNone()) : (0, Validation2.valid)(maybe.value);
1766
2022
  Validation2.map = (f) => (data) => (0, Validation2.isValid)(data) ? (0, Validation2.valid)(f(data.value)) : data;
1767
2023
  Validation2.ap = (arg) => (data) => {
1768
2024
  if ((0, Validation2.isValid)(data) && (0, Validation2.isValid)(arg)) return (0, Validation2.valid)(data.value(arg.value));
@@ -1814,14 +2070,17 @@ var TaskValidation;
1814
2070
  TaskValidation2.invalid = (error) => Task.resolve(Validation.invalid(error));
1815
2071
  TaskValidation2.invalidAll = (errors) => Task.resolve(Validation.invalidAll(errors));
1816
2072
  TaskValidation2.fromValidation = (validation) => Task.resolve(validation);
2073
+ TaskValidation2.fromNullable = (onNull) => (value) => Task.resolve(value === null || value === void 0 ? Validation.invalid(onNull()) : Validation.valid(value));
2074
+ TaskValidation2.fromMaybe = (onNone) => (maybe) => Task.resolve(Maybe.isNone(maybe) ? Validation.invalid(onNone()) : Validation.valid(maybe.value));
2075
+ TaskValidation2.fromResult = (result) => Task.resolve(Validation.fromResult(result));
1817
2076
  TaskValidation2.tryCatch = (f, onError) => Task.from(
1818
- () => f().then(Validation.valid).catch((e) => Validation.invalid(onError(e)))
2077
+ (signal) => f(signal).then(Validation.valid).catch((e) => Validation.invalid(onError(e)))
1819
2078
  );
1820
2079
  TaskValidation2.map = (f) => (data) => Task.map(Validation.map(f))(data);
1821
2080
  TaskValidation2.ap = (arg) => (data) => Task.from(
1822
- () => Promise.all([
1823
- Deferred.toPromise(data()),
1824
- Deferred.toPromise(arg())
2081
+ (signal) => Promise.all([
2082
+ Deferred.toPromise(data(signal)),
2083
+ Deferred.toPromise(arg(signal))
1825
2084
  ]).then(([vf, va]) => Validation.ap(va)(vf))
1826
2085
  );
1827
2086
  TaskValidation2.fold = (onInvalid, onValid) => (data) => Task.map(Validation.fold(onInvalid, onValid))(data);
@@ -1832,13 +2091,13 @@ var TaskValidation;
1832
2091
  (validation) => Validation.isValid(validation) ? Task.resolve(validation) : fallback(validation.errors)
1833
2092
  )(data);
1834
2093
  TaskValidation2.product = (first, second) => Task.from(
1835
- () => Promise.all([
1836
- Deferred.toPromise(first()),
1837
- Deferred.toPromise(second())
2094
+ (signal) => Promise.all([
2095
+ Deferred.toPromise(first(signal)),
2096
+ Deferred.toPromise(second(signal))
1838
2097
  ]).then(([va, vb]) => Validation.product(va, vb))
1839
2098
  );
1840
2099
  TaskValidation2.productAll = (data) => Task.from(
1841
- () => Promise.all(data.map((t) => Deferred.toPromise(t()))).then((results) => Validation.productAll(results))
2100
+ (signal) => Promise.all(data.map((t) => Deferred.toPromise(t(signal)))).then((results) => Validation.productAll(results))
1842
2101
  );
1843
2102
  })(TaskValidation || (TaskValidation = {}));
1844
2103
 
@@ -1924,13 +2183,6 @@ var Tuple;
1924
2183
  };
1925
2184
  })(Tuple || (Tuple = {}));
1926
2185
 
1927
- // src/Types/Brand.ts
1928
- var Brand;
1929
- ((Brand2) => {
1930
- Brand2.wrap = () => (value) => value;
1931
- Brand2.unwrap = (branded) => branded;
1932
- })(Brand || (Brand = {}));
1933
-
1934
2186
  // src/Types/NonEmptyList.ts
1935
2187
  var isNonEmptyList = (list) => list.length > 0;
1936
2188
 
@@ -1991,6 +2243,40 @@ var Arr;
1991
2243
  }
1992
2244
  return [pass, fail];
1993
2245
  };
2246
+ Arr2.compact = (data) => {
2247
+ const result = [];
2248
+ for (const item of data) {
2249
+ if (item.kind === "Some") {
2250
+ result.push(item.value);
2251
+ }
2252
+ }
2253
+ return result;
2254
+ };
2255
+ Arr2.separate = (data) => {
2256
+ const errors = [];
2257
+ const successes = [];
2258
+ for (const item of data) {
2259
+ if (item.kind === "Ok") {
2260
+ successes.push(item.value);
2261
+ } else {
2262
+ errors.push(item.error);
2263
+ }
2264
+ }
2265
+ return [errors, successes];
2266
+ };
2267
+ Arr2.partitionMap = (f) => (data) => {
2268
+ const errors = [];
2269
+ const successes = [];
2270
+ for (const item of data) {
2271
+ const mapped = f(item);
2272
+ if (mapped.kind === "Ok") {
2273
+ successes.push(mapped.value);
2274
+ } else {
2275
+ errors.push(mapped.error);
2276
+ }
2277
+ }
2278
+ return [errors, successes];
2279
+ };
1994
2280
  Arr2.groupBy = (f) => (data) => {
1995
2281
  const result = {};
1996
2282
  for (const a of data) {
@@ -2015,11 +2301,25 @@ var Arr;
2015
2301
  }
2016
2302
  return result;
2017
2303
  };
2304
+ Arr2.uniqWith = (eq) => (data) => {
2305
+ const result = [];
2306
+ for (const a of data) {
2307
+ if (!result.some((x) => eq(x, a))) {
2308
+ result.push(a);
2309
+ }
2310
+ }
2311
+ return result;
2312
+ };
2018
2313
  Arr2.sortBy = (compare) => (data) => {
2019
2314
  const arr = data;
2020
2315
  if (typeof arr.toSorted === "function") return arr.toSorted(compare);
2021
2316
  return [...data].sort(compare);
2022
2317
  };
2318
+ Arr2.sortWith = (ord) => (data) => {
2319
+ const arr = data;
2320
+ if (typeof arr.toSorted === "function") return arr.toSorted(ord);
2321
+ return [...data].sort(ord);
2322
+ };
2023
2323
  Arr2.zip = (other) => (data) => {
2024
2324
  const len = Math.min(data.length, other.length);
2025
2325
  const result = new Array(len);
@@ -2052,7 +2352,23 @@ var Arr;
2052
2352
  }
2053
2353
  return result;
2054
2354
  };
2055
- Arr2.flatten = (data) => [].concat(...data);
2355
+ Arr2.flatten = (data) => {
2356
+ let totalLen = 0;
2357
+ const outerLen = data.length;
2358
+ for (let i = 0; i < outerLen; i++) {
2359
+ totalLen += data[i].length;
2360
+ }
2361
+ const result = new Array(totalLen);
2362
+ let idx = 0;
2363
+ for (let i = 0; i < outerLen; i++) {
2364
+ const chunk = data[i];
2365
+ const innerLen = chunk.length;
2366
+ for (let j = 0; j < innerLen; j++) {
2367
+ result[idx++] = chunk[j];
2368
+ }
2369
+ }
2370
+ return result;
2371
+ };
2056
2372
  Arr2.flatMap = (f) => (data) => {
2057
2373
  const n = data.length;
2058
2374
  const result = [];
@@ -2291,8 +2607,8 @@ var Num;
2291
2607
  }
2292
2608
  return result;
2293
2609
  };
2294
- Num2.clamp = (min, max) => (n) => Math.min(Math.max(n, min), max);
2295
- Num2.between = (min, max) => (n) => n >= min && n <= max;
2610
+ Num2.clamp = (min2, max2) => (n) => Math.min(Math.max(n, min2), max2);
2611
+ Num2.between = (min2, max2) => (n) => n >= min2 && n <= max2;
2296
2612
  Num2.parse = (s) => {
2297
2613
  if (s.trim() === "") return Maybe.none();
2298
2614
  const n = Number(s);
@@ -2308,6 +2624,28 @@ var Num;
2308
2624
  Num2.floor = (n) => Math.floor(n);
2309
2625
  Num2.ceil = (n) => Math.ceil(n);
2310
2626
  Num2.remainder = (divisor) => (n) => divisor === 0 ? Maybe.none() : Maybe.some(n % divisor);
2627
+ Num2.sum = (ns) => {
2628
+ let result = 0;
2629
+ for (let i = 0; i < ns.length; i++) result += ns[i];
2630
+ return result;
2631
+ };
2632
+ Num2.mean = (ns) => ns.length === 0 ? Maybe.none() : Maybe.some((0, Num2.sum)(ns) / ns.length);
2633
+ Num2.min = (ns) => {
2634
+ if (ns.length === 0) return Maybe.none();
2635
+ let [result] = ns;
2636
+ for (let i = 1; i < ns.length; i++) {
2637
+ if (ns[i] < result) result = ns[i];
2638
+ }
2639
+ return Maybe.some(result);
2640
+ };
2641
+ Num2.max = (ns) => {
2642
+ if (ns.length === 0) return Maybe.none();
2643
+ let [result] = ns;
2644
+ for (let i = 1; i < ns.length; i++) {
2645
+ if (ns[i] > result) result = ns[i];
2646
+ }
2647
+ return Maybe.some(result);
2648
+ };
2311
2649
  })(Num || (Num = {}));
2312
2650
 
2313
2651
  // src/Utils/Rec.ts
@@ -2431,6 +2769,7 @@ var Str;
2431
2769
  Str2.endsWith = (suffix) => (s) => s.endsWith(suffix);
2432
2770
  Str2.toUpperCase = (s) => s.toUpperCase();
2433
2771
  Str2.toLowerCase = (s) => s.toLowerCase();
2772
+ Str2.capitalize = (s) => s.length === 0 ? "" : s.charAt(0).toUpperCase() + s.slice(1);
2434
2773
  Str2.lines = (s) => s.split(/\r?\n|\r/);
2435
2774
  Str2.words = (s) => s.trim().split(/\s+/).filter(Boolean);
2436
2775
  Str2.isEmpty = (s) => s.length === 0;
@@ -2469,6 +2808,13 @@ var Str;
2469
2808
  return isNaN(n) ? Maybe.none() : Maybe.some(n);
2470
2809
  }
2471
2810
  };
2811
+ Str2.parseJson = (s) => {
2812
+ try {
2813
+ return Result.ok(JSON.parse(s));
2814
+ } catch (e) {
2815
+ return Result.error(e);
2816
+ }
2817
+ };
2472
2818
  })(Str || (Str = {}));
2473
2819
 
2474
2820
  // src/Utils/Uniq.ts
@@ -2548,14 +2894,19 @@ var Uniq;
2548
2894
  0 && (module.exports = {
2549
2895
  Arr,
2550
2896
  Brand,
2897
+ Combinable,
2551
2898
  Deferred,
2552
2899
  Dict,
2900
+ Duration,
2901
+ Equality,
2902
+ Lazy,
2553
2903
  Lens,
2554
2904
  Logged,
2555
2905
  Maybe,
2556
2906
  Num,
2557
2907
  Op,
2558
2908
  Optional,
2909
+ Ordering,
2559
2910
  Predicate,
2560
2911
  Reader,
2561
2912
  Rec,