@nlozgachev/pipelined 0.19.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/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.19.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": {