@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/README.md +97 -35
- package/dist/{Task-DBW4nOZR.d.mts → Task-CT8iwwuB.d.mts} +108 -5
- package/dist/{Task-DUdIQm-Q.d.ts → Task-GSGtQO1m.d.ts} +108 -5
- package/dist/{chunk-EAR4TIGH.mjs → chunk-2DPG2RDB.mjs} +48 -28
- package/dist/{chunk-B3YNH6GZ.mjs → chunk-C3Z56PCR.mjs} +30 -11
- package/dist/chunk-SSZXZTIX.mjs +1398 -0
- package/dist/core.d.mts +603 -77
- package/dist/core.d.ts +603 -77
- package/dist/core.js +926 -67
- package/dist/core.mjs +4 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +955 -77
- package/dist/index.mjs +5 -3
- package/dist/utils.d.mts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +77 -38
- package/dist/utils.mjs +2 -2
- package/package.json +3 -2
- package/dist/chunk-UWGFO7BH.mjs +0 -560
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-
|
|
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-
|
|
55
|
+
} from "./chunk-C3Z56PCR.mjs";
|
|
55
56
|
import {
|
|
56
57
|
Deferred,
|
|
57
58
|
Maybe,
|
|
58
59
|
Result,
|
|
59
60
|
Task
|
|
60
|
-
} from "./chunk-
|
|
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
package/dist/utils.d.ts
CHANGED
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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(() =>
|
|
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
|
|
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
|
|
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))
|
|
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))
|
|
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 (
|
|
572
|
-
|
|
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
|
|
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
|
|
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
|
|
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")
|
|
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
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nlozgachev/pipelined",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
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",
|