@nlozgachev/pipelined 0.19.0 → 0.21.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.mjs CHANGED
@@ -30,6 +30,7 @@ import {
30
30
  import {
31
31
  Lens,
32
32
  Logged,
33
+ Op,
33
34
  Optional,
34
35
  Predicate,
35
36
  Reader,
@@ -43,7 +44,7 @@ import {
43
44
  These,
44
45
  Tuple,
45
46
  Validation
46
- } from "./chunk-UWGFO7BH.mjs";
47
+ } from "./chunk-SSZXZTIX.mjs";
47
48
  import {
48
49
  Arr,
49
50
  Dict,
@@ -51,13 +52,13 @@ import {
51
52
  Rec,
52
53
  Str,
53
54
  Uniq
54
- } from "./chunk-B3YNH6GZ.mjs";
55
+ } from "./chunk-C3Z56PCR.mjs";
55
56
  import {
56
57
  Deferred,
57
58
  Maybe,
58
59
  Result,
59
60
  Task
60
- } from "./chunk-EAR4TIGH.mjs";
61
+ } from "./chunk-2DPG2RDB.mjs";
61
62
  import {
62
63
  Brand
63
64
  } from "./chunk-BYWKZLHM.mjs";
@@ -73,6 +74,7 @@ export {
73
74
  Logged,
74
75
  Maybe,
75
76
  Num,
77
+ Op,
76
78
  Optional,
77
79
  Predicate,
78
80
  Reader,
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-CT8iwwuB.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-GSGtQO1m.js';
2
2
  import { N as NonEmptyList } from './NonEmptyList-BlGFjor5.js';
3
3
 
4
4
  /**
package/dist/utils.js CHANGED
@@ -30,15 +30,13 @@ __export(Utils_exports, {
30
30
  module.exports = __toCommonJS(Utils_exports);
31
31
 
32
32
  // src/Core/Deferred.ts
33
- var _store = /* @__PURE__ */ new WeakMap();
34
33
  var Deferred;
35
34
  ((Deferred2) => {
36
- Deferred2.fromPromise = (p) => {
37
- const d = { then: ((f) => p.then(f)) };
38
- _store.set(d, p);
39
- return d;
40
- };
41
- Deferred2.toPromise = (d) => _store.get(d) ?? new Promise((resolve) => d.then(resolve));
35
+ Deferred2.fromPromise = (p) => (
36
+ // eslint-disable-next-line unicorn/no-thenable -- Deferred is intentionally thenable; it is the mechanism that makes Task awaitable
37
+ { then: ((f) => p.then(f)) }
38
+ );
39
+ Deferred2.toPromise = (d) => new Promise((resolve) => d.then(resolve));
42
40
  })(Deferred || (Deferred = {}));
43
41
 
44
42
  // src/Core/Result.ts
@@ -100,77 +98,99 @@ var Maybe;
100
98
  })(Maybe || (Maybe = {}));
101
99
 
102
100
  // src/Core/Task.ts
103
- var toPromise = (task) => Deferred.toPromise(task());
101
+ var toPromise = (task, signal) => Deferred.toPromise(task(signal));
104
102
  var Task;
105
103
  ((Task2) => {
106
104
  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))));
105
+ Task2.from = (f) => (signal) => Deferred.fromPromise(f(signal));
106
+ Task2.map = (f) => (data) => (0, Task2.from)((signal) => toPromise(data, signal).then(f));
107
+ Task2.chain = (f) => (data) => (0, Task2.from)((signal) => toPromise(data, signal).then((a) => toPromise(f(a), signal)));
110
108
  Task2.ap = (arg) => (data) => (0, Task2.from)(
111
- () => Promise.all([
112
- toPromise(data),
113
- toPromise(arg)
109
+ (signal) => Promise.all([
110
+ toPromise(data, signal),
111
+ toPromise(arg, signal)
114
112
  ]).then(([f, a]) => f(a))
115
113
  );
116
114
  Task2.tap = (f) => (data) => (0, Task2.from)(
117
- () => toPromise(data).then((a) => {
115
+ (signal) => toPromise(data, signal).then((a) => {
118
116
  f(a);
119
117
  return a;
120
118
  })
121
119
  );
122
120
  Task2.all = (tasks) => (0, Task2.from)(
123
- () => Promise.all(tasks.map((t) => toPromise(t)))
121
+ (signal) => Promise.all(tasks.map((t) => toPromise(t, signal)))
124
122
  );
125
123
  Task2.delay = (ms) => (data) => (0, Task2.from)(
126
- () => new Promise(
124
+ (signal) => new Promise(
127
125
  (resolve2) => setTimeout(
128
- () => toPromise(data).then(resolve2),
126
+ () => toPromise(data, signal).then(resolve2),
129
127
  ms
130
128
  )
131
129
  )
132
130
  );
133
- Task2.repeat = (options) => (task) => (0, Task2.from)(() => {
131
+ Task2.repeat = (options) => (task) => (0, Task2.from)((signal) => {
134
132
  const { times, delay: ms } = options;
135
133
  if (times <= 0) return Promise.resolve([]);
136
134
  const results = [];
137
135
  const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
138
- const run = (left) => toPromise(task).then((a) => {
136
+ const run = (left) => toPromise(task, signal).then((a) => {
139
137
  results.push(a);
140
138
  if (left <= 1) return results;
141
139
  return wait().then(() => run(left - 1));
142
140
  });
143
141
  return run(times);
144
142
  });
145
- Task2.repeatUntil = (options) => (task) => (0, Task2.from)(() => {
143
+ Task2.repeatUntil = (options) => (task) => (0, Task2.from)((signal) => {
146
144
  const { when: predicate, delay: ms } = options;
147
145
  const wait = () => ms !== void 0 && ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve();
148
- const run = () => toPromise(task).then((a) => {
146
+ const run = () => toPromise(task, signal).then((a) => {
149
147
  if (predicate(a)) return a;
150
148
  return wait().then(run);
151
149
  });
152
150
  return run();
153
151
  });
154
- Task2.race = (tasks) => (0, Task2.from)(() => Promise.race(tasks.map(toPromise)));
155
- Task2.sequential = (tasks) => (0, Task2.from)(async () => {
152
+ Task2.race = (tasks) => (0, Task2.from)((signal) => Promise.race(tasks.map((t) => toPromise(t, signal))));
153
+ Task2.sequential = (tasks) => (0, Task2.from)(async (signal) => {
156
154
  const results = [];
157
155
  for (const task of tasks) {
158
- results.push(await toPromise(task));
156
+ results.push(await toPromise(task, signal));
159
157
  }
160
158
  return results;
161
159
  });
162
- Task2.timeout = (ms, onTimeout) => (task) => (0, Task2.from)(() => {
160
+ Task2.timeout = (ms, onTimeout) => (task) => (0, Task2.from)((outerSignal) => {
161
+ const controller = new AbortController();
162
+ const onOuterAbort = () => controller.abort();
163
+ outerSignal?.addEventListener("abort", onOuterAbort, { once: true });
163
164
  let timerId;
164
165
  return Promise.race([
165
- toPromise(task).then((a) => {
166
+ toPromise(task, controller.signal).then((a) => {
166
167
  clearTimeout(timerId);
168
+ outerSignal?.removeEventListener("abort", onOuterAbort);
167
169
  return Result.ok(a);
168
170
  }),
169
171
  new Promise((resolve2) => {
170
- timerId = setTimeout(() => resolve2(Result.err(onTimeout())), ms);
172
+ timerId = setTimeout(() => {
173
+ controller.abort();
174
+ outerSignal?.removeEventListener("abort", onOuterAbort);
175
+ resolve2(Result.err(onTimeout()));
176
+ }, ms);
171
177
  })
172
178
  ]);
173
179
  });
180
+ Task2.abortable = (factory) => {
181
+ const controller = new AbortController();
182
+ const task = (outerSignal) => {
183
+ if (outerSignal) {
184
+ if (outerSignal.aborted) {
185
+ controller.abort(outerSignal.reason);
186
+ } else {
187
+ outerSignal.addEventListener("abort", () => controller.abort(outerSignal.reason), { once: true });
188
+ }
189
+ }
190
+ return Deferred.fromPromise(factory(controller.signal));
191
+ };
192
+ return { task, abort: () => controller.abort() };
193
+ };
174
194
  })(Task || (Task = {}));
175
195
 
176
196
  // src/Types/NonEmptyList.ts
@@ -532,7 +552,7 @@ var Rec;
532
552
  const vals = Object.values(data);
533
553
  const result = {};
534
554
  for (let i = 0; i < keys2.length; i++) {
535
- result[keys2[i]] = f(vals[i]);
555
+ Object.defineProperty(result, keys2[i], { value: f(vals[i]), writable: true, enumerable: true, configurable: true });
536
556
  }
537
557
  return result;
538
558
  };
@@ -541,21 +561,30 @@ var Rec;
541
561
  const vals = Object.values(data);
542
562
  const result = {};
543
563
  for (let i = 0; i < keys2.length; i++) {
544
- result[keys2[i]] = f(keys2[i], vals[i]);
564
+ Object.defineProperty(result, keys2[i], {
565
+ value: f(keys2[i], vals[i]),
566
+ writable: true,
567
+ enumerable: true,
568
+ configurable: true
569
+ });
545
570
  }
546
571
  return result;
547
572
  };
548
573
  Rec2.filter = (predicate) => (data) => {
549
574
  const result = {};
550
575
  for (const [k, v] of Object.entries(data)) {
551
- if (predicate(v)) result[k] = v;
576
+ if (predicate(v)) {
577
+ Object.defineProperty(result, k, { value: v, writable: true, enumerable: true, configurable: true });
578
+ }
552
579
  }
553
580
  return result;
554
581
  };
555
582
  Rec2.filterWithKey = (predicate) => (data) => {
556
583
  const result = {};
557
584
  for (const [k, v] of Object.entries(data)) {
558
- if (predicate(k, v)) result[k] = v;
585
+ if (predicate(k, v)) {
586
+ Object.defineProperty(result, k, { value: v, writable: true, enumerable: true, configurable: true });
587
+ }
559
588
  }
560
589
  return result;
561
590
  };
@@ -568,8 +597,11 @@ var Rec;
568
597
  const result = {};
569
598
  for (const item of items) {
570
599
  const key = keyFn(item);
571
- if (key in result) result[key].push(item);
572
- else result[key] = [item];
600
+ if (Object.hasOwn(result, key)) {
601
+ result[key].push(item);
602
+ } else {
603
+ Object.defineProperty(result, key, { value: [item], writable: true, enumerable: true, configurable: true });
604
+ }
573
605
  }
574
606
  return result;
575
607
  };
@@ -577,7 +609,7 @@ var Rec;
577
609
  const result = {};
578
610
  for (const key of pickedKeys) {
579
611
  if (Object.hasOwn(data, key)) {
580
- result[key] = data[key];
612
+ Object.defineProperty(result, key, { value: data[key], writable: true, enumerable: true, configurable: true });
581
613
  }
582
614
  }
583
615
  return result;
@@ -587,7 +619,12 @@ var Rec;
587
619
  const result = {};
588
620
  for (const key of Object.keys(data)) {
589
621
  if (!omitSet.has(key)) {
590
- result[key] = data[key];
622
+ Object.defineProperty(result, key, {
623
+ value: data[key],
624
+ writable: true,
625
+ enumerable: true,
626
+ configurable: true
627
+ });
591
628
  }
592
629
  }
593
630
  return result;
@@ -601,14 +638,16 @@ var Rec;
601
638
  Rec2.mapKeys = (f) => (data) => {
602
639
  const result = {};
603
640
  for (const [k, v] of Object.entries(data)) {
604
- result[f(k)] = v;
641
+ Object.defineProperty(result, f(k), { value: v, writable: true, enumerable: true, configurable: true });
605
642
  }
606
643
  return result;
607
644
  };
608
645
  Rec2.compact = (data) => {
609
646
  const result = {};
610
647
  for (const [k, v] of Object.entries(data)) {
611
- if (v.kind === "Some") result[k] = v.value;
648
+ if (v.kind === "Some") {
649
+ Object.defineProperty(result, k, { value: v.value, writable: true, enumerable: true, configurable: true });
650
+ }
612
651
  }
613
652
  return result;
614
653
  };
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-C3Z56PCR.mjs";
9
+ import "./chunk-2DPG2RDB.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.21.0",
4
+ "description": "Opinionated functional abstractions for TypeScript",
5
5
  "license": "BSD-3-Clause",
6
6
  "homepage": "https://pipelined.lozgachev.dev",
7
7
  "repository": {
@@ -57,6 +57,7 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@types/node": "25.5.0",
60
+ "fast-check": "4.6.0",
60
61
  "@vitest/coverage-v8": "4.1.0",
61
62
  "dprint": "0.53.0",
62
63
  "oxlint": "1.56.0",