@nlozgachev/pipelined 0.18.0 → 0.20.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
@@ -245,8 +245,7 @@ var on = (f, g) => (a, b) => f(g(a), g(b));
245
245
 
246
246
  // src/Composition/pipe.ts
247
247
  function pipe(a, ab, bc, cd, de, ef, fg, gh, hi, ij, jk) {
248
- const len = arguments.length;
249
- switch (len) {
248
+ switch (arguments.length) {
250
249
  case 1:
251
250
  return a;
252
251
  case 2:
@@ -574,77 +573,99 @@ var RemoteData;
574
573
  })(RemoteData || (RemoteData = {}));
575
574
 
576
575
  // src/Core/Task.ts
577
- var toPromise = (task) => Deferred.toPromise(task());
576
+ var toPromise = (task, signal) => Deferred.toPromise(task(signal));
578
577
  var Task;
579
578
  ((Task2) => {
580
579
  Task2.resolve = (value) => () => Deferred.fromPromise(Promise.resolve(value));
581
- Task2.from = (f) => () => Deferred.fromPromise(f());
582
- Task2.map = (f) => (data) => (0, Task2.from)(() => toPromise(data).then(f));
583
- Task2.chain = (f) => (data) => (0, Task2.from)(() => toPromise(data).then((a) => toPromise(f(a))));
580
+ Task2.from = (f) => (signal) => Deferred.fromPromise(f(signal));
581
+ Task2.map = (f) => (data) => (0, Task2.from)((signal) => toPromise(data, signal).then(f));
582
+ Task2.chain = (f) => (data) => (0, Task2.from)((signal) => toPromise(data, signal).then((a) => toPromise(f(a), signal)));
584
583
  Task2.ap = (arg) => (data) => (0, Task2.from)(
585
- () => Promise.all([
586
- toPromise(data),
587
- toPromise(arg)
584
+ (signal) => Promise.all([
585
+ toPromise(data, signal),
586
+ toPromise(arg, signal)
588
587
  ]).then(([f, a]) => f(a))
589
588
  );
590
589
  Task2.tap = (f) => (data) => (0, Task2.from)(
591
- () => toPromise(data).then((a) => {
590
+ (signal) => toPromise(data, signal).then((a) => {
592
591
  f(a);
593
592
  return a;
594
593
  })
595
594
  );
596
595
  Task2.all = (tasks) => (0, Task2.from)(
597
- () => Promise.all(tasks.map((t) => toPromise(t)))
596
+ (signal) => Promise.all(tasks.map((t) => toPromise(t, signal)))
598
597
  );
599
598
  Task2.delay = (ms) => (data) => (0, Task2.from)(
600
- () => new Promise(
599
+ (signal) => new Promise(
601
600
  (resolve2) => setTimeout(
602
- () => toPromise(data).then(resolve2),
601
+ () => toPromise(data, signal).then(resolve2),
603
602
  ms
604
603
  )
605
604
  )
606
605
  );
607
- Task2.repeat = (options) => (task) => (0, Task2.from)(() => {
606
+ Task2.repeat = (options) => (task) => (0, Task2.from)((signal) => {
608
607
  const { times, delay: ms } = options;
609
608
  if (times <= 0) return Promise.resolve([]);
610
609
  const results = [];
611
610
  const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
612
- const run = (left) => toPromise(task).then((a) => {
611
+ const run = (left) => toPromise(task, signal).then((a) => {
613
612
  results.push(a);
614
613
  if (left <= 1) return results;
615
614
  return wait().then(() => run(left - 1));
616
615
  });
617
616
  return run(times);
618
617
  });
619
- Task2.repeatUntil = (options) => (task) => (0, Task2.from)(() => {
618
+ Task2.repeatUntil = (options) => (task) => (0, Task2.from)((signal) => {
620
619
  const { when: predicate, delay: ms } = options;
621
620
  const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
622
- const run = () => toPromise(task).then((a) => {
621
+ const run = () => toPromise(task, signal).then((a) => {
623
622
  if (predicate(a)) return a;
624
623
  return wait().then(run);
625
624
  });
626
625
  return run();
627
626
  });
628
- Task2.race = (tasks) => (0, Task2.from)(() => Promise.race(tasks.map(toPromise)));
629
- Task2.sequential = (tasks) => (0, Task2.from)(async () => {
627
+ Task2.race = (tasks) => (0, Task2.from)((signal) => Promise.race(tasks.map((t) => toPromise(t, signal))));
628
+ Task2.sequential = (tasks) => (0, Task2.from)(async (signal) => {
630
629
  const results = [];
631
630
  for (const task of tasks) {
632
- results.push(await toPromise(task));
631
+ results.push(await toPromise(task, signal));
633
632
  }
634
633
  return results;
635
634
  });
636
- Task2.timeout = (ms, onTimeout) => (task) => (0, Task2.from)(() => {
635
+ Task2.timeout = (ms, onTimeout) => (task) => (0, Task2.from)((outerSignal) => {
636
+ const controller = new AbortController();
637
+ const onOuterAbort = () => controller.abort();
638
+ outerSignal?.addEventListener("abort", onOuterAbort, { once: true });
637
639
  let timerId;
638
640
  return Promise.race([
639
- toPromise(task).then((a) => {
641
+ toPromise(task, controller.signal).then((a) => {
640
642
  clearTimeout(timerId);
643
+ outerSignal?.removeEventListener("abort", onOuterAbort);
641
644
  return Result.ok(a);
642
645
  }),
643
646
  new Promise((resolve2) => {
644
- timerId = setTimeout(() => resolve2(Result.err(onTimeout())), ms);
647
+ timerId = setTimeout(() => {
648
+ controller.abort();
649
+ outerSignal?.removeEventListener("abort", onOuterAbort);
650
+ resolve2(Result.err(onTimeout()));
651
+ }, ms);
645
652
  })
646
653
  ]);
647
654
  });
655
+ Task2.abortable = (factory) => {
656
+ const controller = new AbortController();
657
+ const task = (outerSignal) => {
658
+ if (outerSignal) {
659
+ if (outerSignal.aborted) {
660
+ controller.abort(outerSignal.reason);
661
+ } else {
662
+ outerSignal.addEventListener("abort", () => controller.abort(outerSignal.reason), { once: true });
663
+ }
664
+ }
665
+ return Deferred.fromPromise(factory(controller.signal));
666
+ };
667
+ return { task, abort: () => controller.abort() };
668
+ };
648
669
  })(Task || (Task = {}));
649
670
 
650
671
  // src/Core/Resource.ts
@@ -739,12 +760,23 @@ var TaskMaybe;
739
760
  })(TaskMaybe || (TaskMaybe = {}));
740
761
 
741
762
  // src/Core/TaskResult.ts
763
+ var cancellableWait = (ms, signal) => {
764
+ if (ms <= 0) return Promise.resolve();
765
+ if (!signal) return new Promise((r) => setTimeout(r, ms));
766
+ return new Promise((resolve) => {
767
+ const id = setTimeout(resolve, ms);
768
+ signal.addEventListener("abort", () => {
769
+ clearTimeout(id);
770
+ resolve();
771
+ }, { once: true });
772
+ });
773
+ };
742
774
  var TaskResult;
743
775
  ((TaskResult2) => {
744
776
  TaskResult2.ok = (value) => Task.resolve(Result.ok(value));
745
777
  TaskResult2.err = (error) => Task.resolve(Result.err(error));
746
778
  TaskResult2.tryCatch = (f, onError) => Task.from(
747
- () => f().then(Result.ok).catch((e) => Result.err(onError(e)))
779
+ (signal) => f(signal).then(Result.ok).catch((e) => Result.err(onError(e)))
748
780
  );
749
781
  TaskResult2.map = (f) => (data) => Task.map(Result.map(f))(data);
750
782
  TaskResult2.mapError = (f) => (data) => Task.map(Result.mapError(f))(data);
@@ -758,43 +790,75 @@ var TaskResult;
758
790
  )(data);
759
791
  TaskResult2.getOrElse = (defaultValue) => (data) => Task.map(Result.getOrElse(defaultValue))(data);
760
792
  TaskResult2.tap = (f) => (data) => Task.map(Result.tap(f))(data);
761
- TaskResult2.retry = (options) => (data) => Task.from(() => {
793
+ TaskResult2.retry = (options) => (data) => Task.from((signal) => {
762
794
  const { attempts, backoff, when: shouldRetry } = options;
763
795
  const getDelay = (n) => backoff === void 0 ? 0 : typeof backoff === "function" ? backoff(n) : backoff;
764
- const run = (left) => Deferred.toPromise(data()).then((result) => {
796
+ const run = (left) => Deferred.toPromise(data(signal)).then((result) => {
765
797
  if (Result.isOk(result)) return result;
766
798
  if (left <= 1) return result;
767
799
  if (shouldRetry !== void 0 && !shouldRetry(result.error)) {
768
800
  return result;
769
801
  }
802
+ if (signal?.aborted) return result;
770
803
  const ms = getDelay(attempts - left + 1);
771
- return (ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve()).then(() => run(left - 1));
804
+ return cancellableWait(ms, signal).then(() => {
805
+ if (signal?.aborted) return result;
806
+ return run(left - 1);
807
+ });
772
808
  });
773
809
  return run(attempts);
774
810
  });
775
- TaskResult2.pollUntil = (options) => (task) => Task.from(() => {
811
+ TaskResult2.pollUntil = (options) => (task) => Task.from((signal) => {
776
812
  const { when: predicate, delay } = options;
777
813
  const getDelay = (attempt) => delay === void 0 ? 0 : typeof delay === "function" ? delay(attempt) : delay;
778
- const run = (attempt) => Deferred.toPromise(task()).then((result) => {
814
+ const run = (attempt) => Deferred.toPromise(task(signal)).then((result) => {
779
815
  if (Result.isErr(result)) return result;
780
816
  if (predicate(result.value)) return result;
817
+ if (signal?.aborted) return result;
781
818
  const ms = getDelay(attempt);
782
- return (ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve()).then(() => run(attempt + 1));
819
+ return cancellableWait(ms, signal).then(() => {
820
+ if (signal?.aborted) return result;
821
+ return run(attempt + 1);
822
+ });
783
823
  });
784
824
  return run(1);
785
825
  });
786
- TaskResult2.timeout = (ms, onTimeout) => (data) => Task.from(() => {
826
+ TaskResult2.timeout = (ms, onTimeout) => (data) => Task.from((outerSignal) => {
827
+ const controller = new AbortController();
828
+ const onOuterAbort = () => controller.abort();
829
+ outerSignal?.addEventListener("abort", onOuterAbort, { once: true });
787
830
  let timerId;
788
831
  return Promise.race([
789
- Deferred.toPromise(data()).then((result) => {
832
+ Deferred.toPromise(data(controller.signal)).then((result) => {
790
833
  clearTimeout(timerId);
834
+ outerSignal?.removeEventListener("abort", onOuterAbort);
791
835
  return result;
792
836
  }),
793
837
  new Promise((resolve) => {
794
- timerId = setTimeout(() => resolve(Result.err(onTimeout())), ms);
838
+ timerId = setTimeout(() => {
839
+ controller.abort();
840
+ outerSignal?.removeEventListener("abort", onOuterAbort);
841
+ resolve(Result.err(onTimeout()));
842
+ }, ms);
795
843
  })
796
844
  ]);
797
845
  });
846
+ TaskResult2.abortable = (factory, onError) => {
847
+ const controller = new AbortController();
848
+ const task = (outerSignal) => {
849
+ if (outerSignal) {
850
+ if (outerSignal.aborted) {
851
+ controller.abort(outerSignal.reason);
852
+ } else {
853
+ outerSignal.addEventListener("abort", () => controller.abort(outerSignal.reason), { once: true });
854
+ }
855
+ }
856
+ return Deferred.fromPromise(
857
+ factory(controller.signal).then(Result.ok).catch((e) => Result.err(onError(e)))
858
+ );
859
+ };
860
+ return { task, abort: () => controller.abort() };
861
+ };
798
862
  })(TaskResult || (TaskResult = {}));
799
863
 
800
864
  // src/Core/Validation.ts
package/dist/index.mjs CHANGED
@@ -26,7 +26,7 @@ import {
26
26
  uncurry,
27
27
  uncurry3,
28
28
  uncurry4
29
- } from "./chunk-5HMYR4XB.mjs";
29
+ } from "./chunk-NRF2FVPZ.mjs";
30
30
  import {
31
31
  Lens,
32
32
  Logged,
@@ -43,7 +43,7 @@ import {
43
43
  These,
44
44
  Tuple,
45
45
  Validation
46
- } from "./chunk-UWGFO7BH.mjs";
46
+ } from "./chunk-7COGDULU.mjs";
47
47
  import {
48
48
  Arr,
49
49
  Dict,
@@ -51,13 +51,13 @@ import {
51
51
  Rec,
52
52
  Str,
53
53
  Uniq
54
- } from "./chunk-B3YNH6GZ.mjs";
54
+ } from "./chunk-AC7RQXWC.mjs";
55
55
  import {
56
56
  Deferred,
57
57
  Maybe,
58
58
  Result,
59
59
  Task
60
- } from "./chunk-EAR4TIGH.mjs";
60
+ } from "./chunk-RUDOUVQR.mjs";
61
61
  import {
62
62
  Brand
63
63
  } from "./chunk-BYWKZLHM.mjs";
package/dist/utils.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { M as Maybe, R as Result, T as Task } from './Task-DBW4nOZR.mjs';
1
+ import { M as Maybe, R as Result, T as Task } from './Task-JOnNAaPq.mjs';
2
2
  import { N as NonEmptyList } from './NonEmptyList-BlGFjor5.mjs';
3
3
 
4
4
  /**
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { M as Maybe, R as Result, T as Task } from './Task-DUdIQm-Q.js';
1
+ import { M as Maybe, R as Result, T as Task } from './Task-BAT6Z6b9.js';
2
2
  import { N as NonEmptyList } from './NonEmptyList-BlGFjor5.js';
3
3
 
4
4
  /**
package/dist/utils.js CHANGED
@@ -100,77 +100,99 @@ var Maybe;
100
100
  })(Maybe || (Maybe = {}));
101
101
 
102
102
  // src/Core/Task.ts
103
- var toPromise = (task) => Deferred.toPromise(task());
103
+ var toPromise = (task, signal) => Deferred.toPromise(task(signal));
104
104
  var Task;
105
105
  ((Task2) => {
106
106
  Task2.resolve = (value) => () => Deferred.fromPromise(Promise.resolve(value));
107
- Task2.from = (f) => () => Deferred.fromPromise(f());
108
- Task2.map = (f) => (data) => (0, Task2.from)(() => toPromise(data).then(f));
109
- Task2.chain = (f) => (data) => (0, Task2.from)(() => toPromise(data).then((a) => toPromise(f(a))));
107
+ Task2.from = (f) => (signal) => Deferred.fromPromise(f(signal));
108
+ Task2.map = (f) => (data) => (0, Task2.from)((signal) => toPromise(data, signal).then(f));
109
+ Task2.chain = (f) => (data) => (0, Task2.from)((signal) => toPromise(data, signal).then((a) => toPromise(f(a), signal)));
110
110
  Task2.ap = (arg) => (data) => (0, Task2.from)(
111
- () => Promise.all([
112
- toPromise(data),
113
- toPromise(arg)
111
+ (signal) => Promise.all([
112
+ toPromise(data, signal),
113
+ toPromise(arg, signal)
114
114
  ]).then(([f, a]) => f(a))
115
115
  );
116
116
  Task2.tap = (f) => (data) => (0, Task2.from)(
117
- () => toPromise(data).then((a) => {
117
+ (signal) => toPromise(data, signal).then((a) => {
118
118
  f(a);
119
119
  return a;
120
120
  })
121
121
  );
122
122
  Task2.all = (tasks) => (0, Task2.from)(
123
- () => Promise.all(tasks.map((t) => toPromise(t)))
123
+ (signal) => Promise.all(tasks.map((t) => toPromise(t, signal)))
124
124
  );
125
125
  Task2.delay = (ms) => (data) => (0, Task2.from)(
126
- () => new Promise(
126
+ (signal) => new Promise(
127
127
  (resolve2) => setTimeout(
128
- () => toPromise(data).then(resolve2),
128
+ () => toPromise(data, signal).then(resolve2),
129
129
  ms
130
130
  )
131
131
  )
132
132
  );
133
- Task2.repeat = (options) => (task) => (0, Task2.from)(() => {
133
+ Task2.repeat = (options) => (task) => (0, Task2.from)((signal) => {
134
134
  const { times, delay: ms } = options;
135
135
  if (times <= 0) return Promise.resolve([]);
136
136
  const results = [];
137
137
  const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
138
- const run = (left) => toPromise(task).then((a) => {
138
+ const run = (left) => toPromise(task, signal).then((a) => {
139
139
  results.push(a);
140
140
  if (left <= 1) return results;
141
141
  return wait().then(() => run(left - 1));
142
142
  });
143
143
  return run(times);
144
144
  });
145
- Task2.repeatUntil = (options) => (task) => (0, Task2.from)(() => {
145
+ Task2.repeatUntil = (options) => (task) => (0, Task2.from)((signal) => {
146
146
  const { when: predicate, delay: ms } = options;
147
147
  const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
148
- const run = () => toPromise(task).then((a) => {
148
+ const run = () => toPromise(task, signal).then((a) => {
149
149
  if (predicate(a)) return a;
150
150
  return wait().then(run);
151
151
  });
152
152
  return run();
153
153
  });
154
- Task2.race = (tasks) => (0, Task2.from)(() => Promise.race(tasks.map(toPromise)));
155
- Task2.sequential = (tasks) => (0, Task2.from)(async () => {
154
+ Task2.race = (tasks) => (0, Task2.from)((signal) => Promise.race(tasks.map((t) => toPromise(t, signal))));
155
+ Task2.sequential = (tasks) => (0, Task2.from)(async (signal) => {
156
156
  const results = [];
157
157
  for (const task of tasks) {
158
- results.push(await toPromise(task));
158
+ results.push(await toPromise(task, signal));
159
159
  }
160
160
  return results;
161
161
  });
162
- Task2.timeout = (ms, onTimeout) => (task) => (0, Task2.from)(() => {
162
+ Task2.timeout = (ms, onTimeout) => (task) => (0, Task2.from)((outerSignal) => {
163
+ const controller = new AbortController();
164
+ const onOuterAbort = () => controller.abort();
165
+ outerSignal?.addEventListener("abort", onOuterAbort, { once: true });
163
166
  let timerId;
164
167
  return Promise.race([
165
- toPromise(task).then((a) => {
168
+ toPromise(task, controller.signal).then((a) => {
166
169
  clearTimeout(timerId);
170
+ outerSignal?.removeEventListener("abort", onOuterAbort);
167
171
  return Result.ok(a);
168
172
  }),
169
173
  new Promise((resolve2) => {
170
- timerId = setTimeout(() => resolve2(Result.err(onTimeout())), ms);
174
+ timerId = setTimeout(() => {
175
+ controller.abort();
176
+ outerSignal?.removeEventListener("abort", onOuterAbort);
177
+ resolve2(Result.err(onTimeout()));
178
+ }, ms);
171
179
  })
172
180
  ]);
173
181
  });
182
+ Task2.abortable = (factory) => {
183
+ const controller = new AbortController();
184
+ const task = (outerSignal) => {
185
+ if (outerSignal) {
186
+ if (outerSignal.aborted) {
187
+ controller.abort(outerSignal.reason);
188
+ } else {
189
+ outerSignal.addEventListener("abort", () => controller.abort(outerSignal.reason), { once: true });
190
+ }
191
+ }
192
+ return Deferred.fromPromise(factory(controller.signal));
193
+ };
194
+ return { task, abort: () => controller.abort() };
195
+ };
174
196
  })(Task || (Task = {}));
175
197
 
176
198
  // src/Types/NonEmptyList.ts
package/dist/utils.mjs CHANGED
@@ -5,8 +5,8 @@ import {
5
5
  Rec,
6
6
  Str,
7
7
  Uniq
8
- } from "./chunk-B3YNH6GZ.mjs";
9
- import "./chunk-EAR4TIGH.mjs";
8
+ } from "./chunk-AC7RQXWC.mjs";
9
+ import "./chunk-RUDOUVQR.mjs";
10
10
  import "./chunk-DBIC62UV.mjs";
11
11
  export {
12
12
  Arr,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nlozgachev/pipelined",
3
- "version": "0.18.0",
4
- "description": "Simple functional programming toolkit for TypeScript",
3
+ "version": "0.20.0",
4
+ "description": "Opinionated functional abstractions for TypeScript",
5
5
  "license": "BSD-3-Clause",
6
6
  "homepage": "https://pipelined.lozgachev.dev",
7
7
  "repository": {