@nlozgachev/pipelined 0.16.0 → 0.18.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 +39 -21
- package/dist/{Task-Bd3gXPRQ.d.mts → Task-DBW4nOZR.d.mts} +79 -79
- package/dist/{Task-BjAkkD6t.d.ts → Task-DUdIQm-Q.d.ts} +79 -79
- package/dist/{chunk-KXAWFKQQ.mjs → chunk-5HMYR4XB.mjs} +0 -2
- package/dist/{chunk-FAZN3IWZ.mjs → chunk-B3YNH6GZ.mjs} +39 -19
- package/dist/{chunk-QPTGO5AS.mjs → chunk-EAR4TIGH.mjs} +26 -26
- package/dist/{chunk-2XKWSZEU.mjs → chunk-UWGFO7BH.mjs} +40 -29
- package/dist/composition.d.mts +18 -18
- package/dist/composition.d.ts +18 -18
- package/dist/composition.js +0 -2
- package/dist/composition.mjs +1 -1
- package/dist/core.d.mts +83 -53
- package/dist/core.d.ts +83 -53
- package/dist/core.js +66 -55
- package/dist/core.mjs +6 -6
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +103 -74
- package/dist/index.mjs +8 -8
- package/dist/utils.d.mts +65 -41
- package/dist/utils.d.ts +65 -41
- package/dist/utils.js +62 -42
- package/dist/utils.mjs +2 -2
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Deferred,
|
|
3
|
-
|
|
3
|
+
Maybe,
|
|
4
4
|
Result,
|
|
5
5
|
Task
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-EAR4TIGH.mjs";
|
|
7
7
|
|
|
8
8
|
// src/Core/Lens.ts
|
|
9
9
|
var Lens;
|
|
@@ -61,12 +61,12 @@ var Optional;
|
|
|
61
61
|
Optional2.prop = () => (key) => (0, Optional2.make)(
|
|
62
62
|
(s) => {
|
|
63
63
|
const val = s[key];
|
|
64
|
-
return val !== null && val !== void 0 ?
|
|
64
|
+
return val !== null && val !== void 0 ? Maybe.some(val) : Maybe.none();
|
|
65
65
|
},
|
|
66
66
|
(a) => (s) => ({ ...s, [key]: a })
|
|
67
67
|
);
|
|
68
68
|
Optional2.index = (i) => (0, Optional2.make)(
|
|
69
|
-
(arr) => i >= 0 && i < arr.length ?
|
|
69
|
+
(arr) => i >= 0 && i < arr.length ? Maybe.some(arr[i]) : Maybe.none(),
|
|
70
70
|
(a) => (arr) => {
|
|
71
71
|
if (i < 0 || i >= arr.length) return arr;
|
|
72
72
|
const copy = [...arr];
|
|
@@ -95,7 +95,7 @@ var Optional;
|
|
|
95
95
|
Optional2.andThen = (inner) => (outer) => (0, Optional2.make)(
|
|
96
96
|
(s) => {
|
|
97
97
|
const mid = outer.get(s);
|
|
98
|
-
return mid.kind === "None" ?
|
|
98
|
+
return mid.kind === "None" ? Maybe.none() : inner.get(mid.value);
|
|
99
99
|
},
|
|
100
100
|
(b) => (s) => {
|
|
101
101
|
const mid = outer.get(s);
|
|
@@ -105,7 +105,7 @@ var Optional;
|
|
|
105
105
|
Optional2.andThenLens = (inner) => (outer) => (0, Optional2.make)(
|
|
106
106
|
(s) => {
|
|
107
107
|
const mid = outer.get(s);
|
|
108
|
-
return mid.kind === "None" ?
|
|
108
|
+
return mid.kind === "None" ? Maybe.none() : Maybe.some(inner.get(mid.value));
|
|
109
109
|
},
|
|
110
110
|
(b) => (s) => {
|
|
111
111
|
const mid = outer.get(s);
|
|
@@ -151,7 +151,7 @@ var Refinement;
|
|
|
151
151
|
Refinement2.compose = (bc) => (ab) => (a) => ab(a) && bc(a);
|
|
152
152
|
Refinement2.and = (second) => (first) => (a) => first(a) && second(a);
|
|
153
153
|
Refinement2.or = (second) => (first) => (a) => first(a) || second(a);
|
|
154
|
-
Refinement2.toFilter = (r) => (a) => r(a) ?
|
|
154
|
+
Refinement2.toFilter = (r) => (a) => r(a) ? Maybe.some(a) : Maybe.none();
|
|
155
155
|
Refinement2.toResult = (r, onFail) => (a) => r(a) ? Result.ok(a) : Result.err(onFail(a));
|
|
156
156
|
})(Refinement || (Refinement = {}));
|
|
157
157
|
|
|
@@ -216,7 +216,7 @@ var RemoteData;
|
|
|
216
216
|
return data;
|
|
217
217
|
};
|
|
218
218
|
RemoteData2.recover = (fallback) => (data) => (0, RemoteData2.isFailure)(data) ? fallback(data.error) : data;
|
|
219
|
-
RemoteData2.
|
|
219
|
+
RemoteData2.toMaybe = (data) => (0, RemoteData2.isSuccess)(data) ? Maybe.some(data.value) : Maybe.none();
|
|
220
220
|
RemoteData2.toResult = (onNotReady) => (data) => (0, RemoteData2.isSuccess)(data) ? Result.ok(data.value) : Result.err((0, RemoteData2.isFailure)(data) ? data.error : onNotReady());
|
|
221
221
|
})(RemoteData || (RemoteData = {}));
|
|
222
222
|
|
|
@@ -285,31 +285,31 @@ var State;
|
|
|
285
285
|
State2.execute = (initialState) => (st) => st(initialState)[1];
|
|
286
286
|
})(State || (State = {}));
|
|
287
287
|
|
|
288
|
-
// src/Core/
|
|
289
|
-
var
|
|
290
|
-
((
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
() => f().then(
|
|
288
|
+
// src/Core/TaskMaybe.ts
|
|
289
|
+
var TaskMaybe;
|
|
290
|
+
((TaskMaybe2) => {
|
|
291
|
+
TaskMaybe2.some = (value) => Task.resolve(Maybe.some(value));
|
|
292
|
+
TaskMaybe2.none = () => Task.resolve(Maybe.none());
|
|
293
|
+
TaskMaybe2.fromMaybe = (option) => Task.resolve(option);
|
|
294
|
+
TaskMaybe2.fromTask = (task) => Task.map(Maybe.some)(task);
|
|
295
|
+
TaskMaybe2.tryCatch = (f) => Task.from(
|
|
296
|
+
() => f().then(Maybe.some).catch(() => Maybe.none())
|
|
297
297
|
);
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
298
|
+
TaskMaybe2.map = (f) => (data) => Task.map(Maybe.map(f))(data);
|
|
299
|
+
TaskMaybe2.chain = (f) => (data) => Task.chain((option) => Maybe.isSome(option) ? f(option.value) : Task.resolve(Maybe.none()))(data);
|
|
300
|
+
TaskMaybe2.ap = (arg) => (data) => Task.from(
|
|
301
301
|
() => Promise.all([
|
|
302
302
|
Deferred.toPromise(data()),
|
|
303
303
|
Deferred.toPromise(arg())
|
|
304
|
-
]).then(([of_, oa]) =>
|
|
304
|
+
]).then(([of_, oa]) => Maybe.ap(oa)(of_))
|
|
305
305
|
);
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
})(
|
|
306
|
+
TaskMaybe2.fold = (onNone, onSome) => (data) => Task.map(Maybe.fold(onNone, onSome))(data);
|
|
307
|
+
TaskMaybe2.match = (cases) => (data) => Task.map(Maybe.match(cases))(data);
|
|
308
|
+
TaskMaybe2.getOrElse = (defaultValue) => (data) => Task.map(Maybe.getOrElse(defaultValue))(data);
|
|
309
|
+
TaskMaybe2.tap = (f) => (data) => Task.map(Maybe.tap(f))(data);
|
|
310
|
+
TaskMaybe2.filter = (predicate) => (data) => Task.map(Maybe.filter(predicate))(data);
|
|
311
|
+
TaskMaybe2.toTaskResult = (onNone) => (data) => Task.map(Maybe.toResult(onNone))(data);
|
|
312
|
+
})(TaskMaybe || (TaskMaybe = {}));
|
|
313
313
|
|
|
314
314
|
// src/Core/TaskResult.ts
|
|
315
315
|
var TaskResult;
|
|
@@ -345,6 +345,17 @@ var TaskResult;
|
|
|
345
345
|
});
|
|
346
346
|
return run(attempts);
|
|
347
347
|
});
|
|
348
|
+
TaskResult2.pollUntil = (options) => (task) => Task.from(() => {
|
|
349
|
+
const { when: predicate, delay } = options;
|
|
350
|
+
const getDelay = (attempt) => delay === void 0 ? 0 : typeof delay === "function" ? delay(attempt) : delay;
|
|
351
|
+
const run = (attempt) => Deferred.toPromise(task()).then((result) => {
|
|
352
|
+
if (Result.isErr(result)) return result;
|
|
353
|
+
if (predicate(result.value)) return result;
|
|
354
|
+
const ms = getDelay(attempt);
|
|
355
|
+
return (ms > 0 ? new Promise((r) => setTimeout(r, ms)) : Promise.resolve()).then(() => run(attempt + 1));
|
|
356
|
+
});
|
|
357
|
+
return run(1);
|
|
358
|
+
});
|
|
348
359
|
TaskResult2.timeout = (ms, onTimeout) => (data) => Task.from(() => {
|
|
349
360
|
let timerId;
|
|
350
361
|
return Promise.race([
|
|
@@ -540,7 +551,7 @@ export {
|
|
|
540
551
|
RemoteData,
|
|
541
552
|
Resource,
|
|
542
553
|
State,
|
|
543
|
-
|
|
554
|
+
TaskMaybe,
|
|
544
555
|
TaskResult,
|
|
545
556
|
Validation,
|
|
546
557
|
TaskValidation,
|
package/dist/composition.d.mts
CHANGED
|
@@ -107,13 +107,13 @@ declare const curry4: <A, B, C, D, E>(f: (a: A, b: B, c: C, d: D) => E) => (a: A
|
|
|
107
107
|
* ```ts
|
|
108
108
|
* // Original data-last (for pipe)
|
|
109
109
|
* pipe(
|
|
110
|
-
*
|
|
111
|
-
*
|
|
110
|
+
* Maybe.some(5),
|
|
111
|
+
* Maybe.map(n => n * 2)
|
|
112
112
|
* ); // Some(10)
|
|
113
113
|
*
|
|
114
114
|
* // Flipped to data-first
|
|
115
|
-
* const mapFirst = flip(
|
|
116
|
-
* mapFirst(
|
|
115
|
+
* const mapFirst = flip(Maybe.map);
|
|
116
|
+
* mapFirst(Maybe.some(5))(n => n * 2); // Some(10)
|
|
117
117
|
* ```
|
|
118
118
|
*
|
|
119
119
|
* @see {@link uncurry} for converting curried functions to multi-argument functions
|
|
@@ -176,7 +176,7 @@ declare function flow<A extends ReadonlyArray<unknown>, B, C, D, E, F, G, H, I,
|
|
|
176
176
|
* @example
|
|
177
177
|
* ```ts
|
|
178
178
|
* identity(42); // 42
|
|
179
|
-
* pipe(
|
|
179
|
+
* pipe(Maybe.some(5), Maybe.fold(() => 0, identity)); // 5
|
|
180
180
|
* ```
|
|
181
181
|
*/
|
|
182
182
|
declare const identity: <A>(a: A) => A;
|
|
@@ -371,10 +371,10 @@ declare const on: <A, B, C>(f: (b1: B, b2: B) => C, g: (a: A) => B) => (a: A, b:
|
|
|
371
371
|
*
|
|
372
372
|
* // With library functions
|
|
373
373
|
* const greeting = pipe(
|
|
374
|
-
*
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
374
|
+
* Maybe.some("Alice"),
|
|
375
|
+
* Maybe.map(name => name.toUpperCase()),
|
|
376
|
+
* Maybe.map(name => `Hello, ${name}!`),
|
|
377
|
+
* Maybe.getOrElse("Hello!")
|
|
378
378
|
* ); // "Hello, ALICE!"
|
|
379
379
|
*
|
|
380
380
|
* // Error handling with Result
|
|
@@ -407,11 +407,11 @@ declare function pipe<A, B, C, D, E, F, G, H, I, J, K>(a: A, ab: (a: A) => B, bc
|
|
|
407
407
|
* ```ts
|
|
408
408
|
* // Debugging a pipeline
|
|
409
409
|
* pipe(
|
|
410
|
-
*
|
|
410
|
+
* Maybe.some(5),
|
|
411
411
|
* tap(x => console.log("Before map:", x)),
|
|
412
|
-
*
|
|
412
|
+
* Maybe.map(n => n * 2),
|
|
413
413
|
* tap(x => console.log("After map:", x)),
|
|
414
|
-
*
|
|
414
|
+
* Maybe.getOrElse(0)
|
|
415
415
|
* );
|
|
416
416
|
* // logs: "Before map: { kind: 'Some', value: 5 }"
|
|
417
417
|
* // logs: "After map: { kind: 'Some', value: 10 }"
|
|
@@ -426,7 +426,7 @@ declare function pipe<A, B, C, D, E, F, G, H, I, J, K>(a: A, ab: (a: A) => B, bc
|
|
|
426
426
|
* );
|
|
427
427
|
* ```
|
|
428
428
|
*
|
|
429
|
-
* @see {@link
|
|
429
|
+
* @see {@link Maybe.tap} for Maybe-specific tap that only runs on Some
|
|
430
430
|
*/
|
|
431
431
|
declare const tap: <A>(f: (a: A) => void) => (a: A) => A;
|
|
432
432
|
|
|
@@ -443,15 +443,15 @@ declare const tap: <A>(f: (a: A) => void) => (a: A) => A;
|
|
|
443
443
|
* uncurry(nested)(); // 42
|
|
444
444
|
*
|
|
445
445
|
* // Original curried function
|
|
446
|
-
*
|
|
446
|
+
* Maybe.map(n => n * 2)(Maybe.some(5)); // Some(10)
|
|
447
447
|
*
|
|
448
448
|
* // Uncurried - all arguments at once
|
|
449
|
-
* const mapUncurried = uncurry(
|
|
450
|
-
* mapUncurried(n => n * 2,
|
|
449
|
+
* const mapUncurried = uncurry(Maybe.map);
|
|
450
|
+
* mapUncurried(n => n * 2, Maybe.some(5)); // Some(10)
|
|
451
451
|
*
|
|
452
452
|
* // Combined with flip for data-first uncurried
|
|
453
|
-
* const mapDataFirst = uncurry(flip(
|
|
454
|
-
* mapDataFirst(
|
|
453
|
+
* const mapDataFirst = uncurry(flip(Maybe.map));
|
|
454
|
+
* mapDataFirst(Maybe.some(5), n => n * 2); // Some(10)
|
|
455
455
|
* ```
|
|
456
456
|
*
|
|
457
457
|
* @see {@link flip} for reversing curried argument order
|
package/dist/composition.d.ts
CHANGED
|
@@ -107,13 +107,13 @@ declare const curry4: <A, B, C, D, E>(f: (a: A, b: B, c: C, d: D) => E) => (a: A
|
|
|
107
107
|
* ```ts
|
|
108
108
|
* // Original data-last (for pipe)
|
|
109
109
|
* pipe(
|
|
110
|
-
*
|
|
111
|
-
*
|
|
110
|
+
* Maybe.some(5),
|
|
111
|
+
* Maybe.map(n => n * 2)
|
|
112
112
|
* ); // Some(10)
|
|
113
113
|
*
|
|
114
114
|
* // Flipped to data-first
|
|
115
|
-
* const mapFirst = flip(
|
|
116
|
-
* mapFirst(
|
|
115
|
+
* const mapFirst = flip(Maybe.map);
|
|
116
|
+
* mapFirst(Maybe.some(5))(n => n * 2); // Some(10)
|
|
117
117
|
* ```
|
|
118
118
|
*
|
|
119
119
|
* @see {@link uncurry} for converting curried functions to multi-argument functions
|
|
@@ -176,7 +176,7 @@ declare function flow<A extends ReadonlyArray<unknown>, B, C, D, E, F, G, H, I,
|
|
|
176
176
|
* @example
|
|
177
177
|
* ```ts
|
|
178
178
|
* identity(42); // 42
|
|
179
|
-
* pipe(
|
|
179
|
+
* pipe(Maybe.some(5), Maybe.fold(() => 0, identity)); // 5
|
|
180
180
|
* ```
|
|
181
181
|
*/
|
|
182
182
|
declare const identity: <A>(a: A) => A;
|
|
@@ -371,10 +371,10 @@ declare const on: <A, B, C>(f: (b1: B, b2: B) => C, g: (a: A) => B) => (a: A, b:
|
|
|
371
371
|
*
|
|
372
372
|
* // With library functions
|
|
373
373
|
* const greeting = pipe(
|
|
374
|
-
*
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
374
|
+
* Maybe.some("Alice"),
|
|
375
|
+
* Maybe.map(name => name.toUpperCase()),
|
|
376
|
+
* Maybe.map(name => `Hello, ${name}!`),
|
|
377
|
+
* Maybe.getOrElse("Hello!")
|
|
378
378
|
* ); // "Hello, ALICE!"
|
|
379
379
|
*
|
|
380
380
|
* // Error handling with Result
|
|
@@ -407,11 +407,11 @@ declare function pipe<A, B, C, D, E, F, G, H, I, J, K>(a: A, ab: (a: A) => B, bc
|
|
|
407
407
|
* ```ts
|
|
408
408
|
* // Debugging a pipeline
|
|
409
409
|
* pipe(
|
|
410
|
-
*
|
|
410
|
+
* Maybe.some(5),
|
|
411
411
|
* tap(x => console.log("Before map:", x)),
|
|
412
|
-
*
|
|
412
|
+
* Maybe.map(n => n * 2),
|
|
413
413
|
* tap(x => console.log("After map:", x)),
|
|
414
|
-
*
|
|
414
|
+
* Maybe.getOrElse(0)
|
|
415
415
|
* );
|
|
416
416
|
* // logs: "Before map: { kind: 'Some', value: 5 }"
|
|
417
417
|
* // logs: "After map: { kind: 'Some', value: 10 }"
|
|
@@ -426,7 +426,7 @@ declare function pipe<A, B, C, D, E, F, G, H, I, J, K>(a: A, ab: (a: A) => B, bc
|
|
|
426
426
|
* );
|
|
427
427
|
* ```
|
|
428
428
|
*
|
|
429
|
-
* @see {@link
|
|
429
|
+
* @see {@link Maybe.tap} for Maybe-specific tap that only runs on Some
|
|
430
430
|
*/
|
|
431
431
|
declare const tap: <A>(f: (a: A) => void) => (a: A) => A;
|
|
432
432
|
|
|
@@ -443,15 +443,15 @@ declare const tap: <A>(f: (a: A) => void) => (a: A) => A;
|
|
|
443
443
|
* uncurry(nested)(); // 42
|
|
444
444
|
*
|
|
445
445
|
* // Original curried function
|
|
446
|
-
*
|
|
446
|
+
* Maybe.map(n => n * 2)(Maybe.some(5)); // Some(10)
|
|
447
447
|
*
|
|
448
448
|
* // Uncurried - all arguments at once
|
|
449
|
-
* const mapUncurried = uncurry(
|
|
450
|
-
* mapUncurried(n => n * 2,
|
|
449
|
+
* const mapUncurried = uncurry(Maybe.map);
|
|
450
|
+
* mapUncurried(n => n * 2, Maybe.some(5)); // Some(10)
|
|
451
451
|
*
|
|
452
452
|
* // Combined with flip for data-first uncurried
|
|
453
|
-
* const mapDataFirst = uncurry(flip(
|
|
454
|
-
* mapDataFirst(
|
|
453
|
+
* const mapDataFirst = uncurry(flip(Maybe.map));
|
|
454
|
+
* mapDataFirst(Maybe.some(5), n => n * 2); // Some(10)
|
|
455
455
|
* ```
|
|
456
456
|
*
|
|
457
457
|
* @see {@link flip} for reversing curried argument order
|
package/dist/composition.js
CHANGED
|
@@ -93,7 +93,6 @@ function compose(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9) {
|
|
|
93
93
|
return f0(f1(f2(f3(f4(f5(f6(f7(f8(f9.apply(this, arguments))))))))));
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
|
-
return f0;
|
|
97
96
|
}
|
|
98
97
|
|
|
99
98
|
// src/Composition/converge.ts
|
|
@@ -156,7 +155,6 @@ function flow(ab, bc, cd, de, ef, fg, gh, hi, ij, jk) {
|
|
|
156
155
|
return jk(ij(hi(gh(fg(ef(de(cd(bc(ab.apply(this, arguments))))))))));
|
|
157
156
|
};
|
|
158
157
|
}
|
|
159
|
-
return ab;
|
|
160
158
|
}
|
|
161
159
|
|
|
162
160
|
// src/Composition/fn.ts
|
package/dist/composition.mjs
CHANGED
package/dist/core.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { D as Deferred, E as Err, N as None, O as Ok, S as Some } from './Task-
|
|
1
|
+
import { M as Maybe, W as WithValue, a as WithLog, R as Result, b as WithKind, c as WithError, T as Task, d as WithErrors, e as WithFirst, f as WithSecond } from './Task-DBW4nOZR.mjs';
|
|
2
|
+
export { D as Deferred, E as Err, N as None, O as Ok, S as Some } from './Task-DBW4nOZR.mjs';
|
|
3
3
|
import { N as NonEmptyList } from './NonEmptyList-BlGFjor5.mjs';
|
|
4
4
|
|
|
5
5
|
/** Keys of T for which undefined is assignable (i.e. optional fields). */
|
|
@@ -8,7 +8,7 @@ type OptionalKeys<T> = {
|
|
|
8
8
|
}[keyof T];
|
|
9
9
|
/**
|
|
10
10
|
* Optional<S, A> focuses on a value A inside a structure S that may or may
|
|
11
|
-
* not be present. Like a Lens, but get returns
|
|
11
|
+
* not be present. Like a Lens, but get returns Maybe<A>.
|
|
12
12
|
*
|
|
13
13
|
* Compose with other Optionals via `andThen`, or with a Lens via `andThenLens`.
|
|
14
14
|
* Convert a Lens to an Optional with `Lens.toOptional`.
|
|
@@ -25,22 +25,22 @@ type OptionalKeys<T> = {
|
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
27
|
type Optional<S, A> = {
|
|
28
|
-
readonly get: (s: S) =>
|
|
28
|
+
readonly get: (s: S) => Maybe<A>;
|
|
29
29
|
readonly set: (a: A) => (s: S) => S;
|
|
30
30
|
};
|
|
31
31
|
declare namespace Optional {
|
|
32
32
|
/**
|
|
33
|
-
* Constructs an Optional from a getter (returning
|
|
33
|
+
* Constructs an Optional from a getter (returning Maybe<A>) and a setter.
|
|
34
34
|
*
|
|
35
35
|
* @example
|
|
36
36
|
* ```ts
|
|
37
37
|
* const firstChar = Optional.make(
|
|
38
|
-
* (s: string) => s.length > 0 ?
|
|
38
|
+
* (s: string) => s.length > 0 ? Maybe.some(s[0]) : Maybe.none(),
|
|
39
39
|
* (c) => (s) => s.length > 0 ? c + s.slice(1) : s,
|
|
40
40
|
* );
|
|
41
41
|
* ```
|
|
42
42
|
*/
|
|
43
|
-
const make: <S, A>(get: (s: S) =>
|
|
43
|
+
const make: <S, A>(get: (s: S) => Maybe<A>, set: (a: A) => (s: S) => S) => Optional<S, A>;
|
|
44
44
|
/**
|
|
45
45
|
* Creates an Optional that focuses on an optional property of an object.
|
|
46
46
|
* Only keys whose type includes undefined (i.e. `field?: T`) are accepted.
|
|
@@ -67,14 +67,14 @@ declare namespace Optional {
|
|
|
67
67
|
*/
|
|
68
68
|
const index: <A>(i: number) => Optional<A[], A>;
|
|
69
69
|
/**
|
|
70
|
-
* Reads the focused value from a structure, returning
|
|
70
|
+
* Reads the focused value from a structure, returning Maybe<A>.
|
|
71
71
|
*
|
|
72
72
|
* @example
|
|
73
73
|
* ```ts
|
|
74
74
|
* pipe(profile, Optional.get(bioOpt)); // Some("...") or None
|
|
75
75
|
* ```
|
|
76
76
|
*/
|
|
77
|
-
const get: <S, A>(opt: Optional<S, A>) => (s: S) =>
|
|
77
|
+
const get: <S, A>(opt: Optional<S, A>) => (s: S) => Maybe<A>;
|
|
78
78
|
/**
|
|
79
79
|
* Replaces the focused value within a structure.
|
|
80
80
|
* For indexed focuses, this is a no-op when the index is out of bounds.
|
|
@@ -500,10 +500,10 @@ declare namespace Refinement {
|
|
|
500
500
|
*/
|
|
501
501
|
const or: <A, C extends A>(second: Refinement<A, C>) => <B extends A>(first: Refinement<A, B>) => Refinement<A, B | C>;
|
|
502
502
|
/**
|
|
503
|
-
* Converts a `Refinement<A, B>` into a function `(a: A) =>
|
|
503
|
+
* Converts a `Refinement<A, B>` into a function `(a: A) => Maybe<B>`.
|
|
504
504
|
*
|
|
505
505
|
* Returns `Some(a)` when the refinement holds, `None` otherwise. Useful for
|
|
506
|
-
* integrating runtime validation into an `
|
|
506
|
+
* integrating runtime validation into an `Maybe`-based pipeline.
|
|
507
507
|
*
|
|
508
508
|
* @example
|
|
509
509
|
* ```ts
|
|
@@ -515,7 +515,7 @@ declare namespace Refinement {
|
|
|
515
515
|
* pipe(42, Refinement.toFilter(isPositive)); // Some(42)
|
|
516
516
|
* ```
|
|
517
517
|
*/
|
|
518
|
-
const toFilter: <A, B extends A>(r: Refinement<A, B>) => (a: A) =>
|
|
518
|
+
const toFilter: <A, B extends A>(r: Refinement<A, B>) => (a: A) => Maybe<B>;
|
|
519
519
|
/**
|
|
520
520
|
* Converts a `Refinement<A, B>` into a function `(a: A) => Result<E, B>`.
|
|
521
521
|
*
|
|
@@ -1025,10 +1025,10 @@ declare namespace RemoteData {
|
|
|
1025
1025
|
*/
|
|
1026
1026
|
const recover: <E, A, B>(fallback: (e: E) => RemoteData<E, B>) => (data: RemoteData<E, A>) => RemoteData<E, A | B>;
|
|
1027
1027
|
/**
|
|
1028
|
-
* Converts a RemoteData to an
|
|
1028
|
+
* Converts a RemoteData to an Maybe.
|
|
1029
1029
|
* Success becomes Some, all other states become None.
|
|
1030
1030
|
*/
|
|
1031
|
-
const
|
|
1031
|
+
const toMaybe: <E, A>(data: RemoteData<E, A>) => Maybe<A>;
|
|
1032
1032
|
/**
|
|
1033
1033
|
* Converts a RemoteData to a Result.
|
|
1034
1034
|
* Success becomes Ok, Failure becomes Err.
|
|
@@ -1148,8 +1148,38 @@ declare namespace TaskResult {
|
|
|
1148
1148
|
backoff?: number | ((attempt: number) => number);
|
|
1149
1149
|
when?: (error: E) => boolean;
|
|
1150
1150
|
}) => <A>(data: TaskResult<E, A>) => TaskResult<E, A>;
|
|
1151
|
+
/**
|
|
1152
|
+
* Polls a TaskResult repeatedly until the success value satisfies a predicate.
|
|
1153
|
+
* Stops immediately and returns `Err` if the task fails.
|
|
1154
|
+
*
|
|
1155
|
+
* `delay` accepts a fixed number of milliseconds or a function `(attempt) => ms`
|
|
1156
|
+
* for a computed delay — useful for starting fast and slowing down over time.
|
|
1157
|
+
*
|
|
1158
|
+
* @example
|
|
1159
|
+
* ```ts
|
|
1160
|
+
* const checkJob = (id: string): TaskResult<string, { status: "pending" | "done" }> =>
|
|
1161
|
+
* TaskResult.tryCatch(() => fetch(`/jobs/${id}`).then(r => r.json()), String);
|
|
1162
|
+
*
|
|
1163
|
+
* // Fixed delay: poll every 2s
|
|
1164
|
+
* pipe(
|
|
1165
|
+
* checkJob(jobId),
|
|
1166
|
+
* TaskResult.pollUntil({ when: job => job.status === "done", delay: 2000 }),
|
|
1167
|
+
* );
|
|
1168
|
+
*
|
|
1169
|
+
* // Computed delay: 1s, 2s, 3s, ...
|
|
1170
|
+
* pipe(
|
|
1171
|
+
* checkJob(jobId),
|
|
1172
|
+
* TaskResult.pollUntil({ when: job => job.status === "done", delay: n => n * 1000 }),
|
|
1173
|
+
* );
|
|
1174
|
+
* ```
|
|
1175
|
+
*/
|
|
1176
|
+
const pollUntil: <A>(options: {
|
|
1177
|
+
when: (a: A) => boolean;
|
|
1178
|
+
delay?: number | ((attempt: number) => number);
|
|
1179
|
+
}) => <E>(task: TaskResult<E, A>) => TaskResult<E, A>;
|
|
1151
1180
|
/**
|
|
1152
1181
|
* Fails a TaskResult with a typed error if it does not resolve within the given time.
|
|
1182
|
+
* Uses `Promise.race` — the underlying operation keeps running after the timeout fires.
|
|
1153
1183
|
*
|
|
1154
1184
|
* @example
|
|
1155
1185
|
* ```ts
|
|
@@ -1451,84 +1481,84 @@ declare namespace State {
|
|
|
1451
1481
|
|
|
1452
1482
|
/**
|
|
1453
1483
|
* A Task that resolves to an optional value.
|
|
1454
|
-
* Combines async operations with the
|
|
1484
|
+
* Combines async operations with the Maybe type for values that may not exist.
|
|
1455
1485
|
*
|
|
1456
1486
|
* @example
|
|
1457
1487
|
* ```ts
|
|
1458
|
-
* const findUser = (id: string):
|
|
1459
|
-
*
|
|
1488
|
+
* const findUser = (id: string): TaskMaybe<User> =>
|
|
1489
|
+
* TaskMaybe.tryCatch(() => db.users.findById(id));
|
|
1460
1490
|
*
|
|
1461
1491
|
* pipe(
|
|
1462
1492
|
* findUser("123"),
|
|
1463
|
-
*
|
|
1464
|
-
*
|
|
1493
|
+
* TaskMaybe.map(user => user.name),
|
|
1494
|
+
* TaskMaybe.getOrElse(() => "Unknown")
|
|
1465
1495
|
* )();
|
|
1466
1496
|
* ```
|
|
1467
1497
|
*/
|
|
1468
|
-
type
|
|
1469
|
-
declare namespace
|
|
1498
|
+
type TaskMaybe<A> = Task<Maybe<A>>;
|
|
1499
|
+
declare namespace TaskMaybe {
|
|
1470
1500
|
/**
|
|
1471
1501
|
* Wraps a value in a Some inside a Task.
|
|
1472
1502
|
*/
|
|
1473
|
-
const some: <A>(value: A) =>
|
|
1503
|
+
const some: <A>(value: A) => TaskMaybe<A>;
|
|
1474
1504
|
/**
|
|
1475
|
-
* Creates a
|
|
1505
|
+
* Creates a TaskMaybe that resolves to None.
|
|
1476
1506
|
*/
|
|
1477
|
-
const none: <A = never>() =>
|
|
1507
|
+
const none: <A = never>() => TaskMaybe<A>;
|
|
1478
1508
|
/**
|
|
1479
|
-
* Lifts an Option into a
|
|
1509
|
+
* Lifts an Option into a TaskMaybe.
|
|
1480
1510
|
*/
|
|
1481
|
-
const
|
|
1511
|
+
const fromMaybe: <A>(option: Maybe<A>) => TaskMaybe<A>;
|
|
1482
1512
|
/**
|
|
1483
|
-
* Lifts a Task into a
|
|
1513
|
+
* Lifts a Task into a TaskMaybe by wrapping its result in Some.
|
|
1484
1514
|
*/
|
|
1485
|
-
const fromTask: <A>(task: Task<A>) =>
|
|
1515
|
+
const fromTask: <A>(task: Task<A>) => TaskMaybe<A>;
|
|
1486
1516
|
/**
|
|
1487
|
-
* Creates a
|
|
1517
|
+
* Creates a TaskMaybe from a Promise-returning function.
|
|
1488
1518
|
* Returns Some if the promise resolves, None if it rejects.
|
|
1489
1519
|
*
|
|
1490
1520
|
* @example
|
|
1491
1521
|
* ```ts
|
|
1492
|
-
* const fetchUser =
|
|
1522
|
+
* const fetchUser = TaskMaybe.tryCatch(() =>
|
|
1493
1523
|
* fetch("/user/1").then(r => r.json())
|
|
1494
1524
|
* );
|
|
1495
1525
|
* ```
|
|
1496
1526
|
*/
|
|
1497
|
-
const tryCatch: <A>(f: () => Promise<A>) =>
|
|
1527
|
+
const tryCatch: <A>(f: () => Promise<A>) => TaskMaybe<A>;
|
|
1498
1528
|
/**
|
|
1499
|
-
* Transforms the value inside a
|
|
1529
|
+
* Transforms the value inside a TaskMaybe.
|
|
1500
1530
|
*/
|
|
1501
|
-
const map: <A, B>(f: (a: A) => B) => (data:
|
|
1531
|
+
const map: <A, B>(f: (a: A) => B) => (data: TaskMaybe<A>) => TaskMaybe<B>;
|
|
1502
1532
|
/**
|
|
1503
|
-
* Chains
|
|
1533
|
+
* Chains TaskMaybe computations. If the first resolves to Some, passes the
|
|
1504
1534
|
* value to f. If the first resolves to None, propagates None.
|
|
1505
1535
|
*
|
|
1506
1536
|
* @example
|
|
1507
1537
|
* ```ts
|
|
1508
1538
|
* pipe(
|
|
1509
1539
|
* findUser("123"),
|
|
1510
|
-
*
|
|
1540
|
+
* TaskMaybe.chain(user => findOrg(user.orgId))
|
|
1511
1541
|
* )();
|
|
1512
1542
|
* ```
|
|
1513
1543
|
*/
|
|
1514
|
-
const chain: <A, B>(f: (a: A) =>
|
|
1544
|
+
const chain: <A, B>(f: (a: A) => TaskMaybe<B>) => (data: TaskMaybe<A>) => TaskMaybe<B>;
|
|
1515
1545
|
/**
|
|
1516
|
-
* Applies a function wrapped in a
|
|
1546
|
+
* Applies a function wrapped in a TaskMaybe to a value wrapped in a TaskMaybe.
|
|
1517
1547
|
* Both Tasks run in parallel.
|
|
1518
1548
|
*/
|
|
1519
|
-
const ap: <A>(arg:
|
|
1549
|
+
const ap: <A>(arg: TaskMaybe<A>) => <B>(data: TaskMaybe<(a: A) => B>) => TaskMaybe<B>;
|
|
1520
1550
|
/**
|
|
1521
|
-
* Extracts a value from a
|
|
1551
|
+
* Extracts a value from a TaskMaybe by providing handlers for both cases.
|
|
1522
1552
|
*/
|
|
1523
|
-
const fold: <A, B>(onNone: () => B, onSome: (a: A) => B) => (data:
|
|
1553
|
+
const fold: <A, B>(onNone: () => B, onSome: (a: A) => B) => (data: TaskMaybe<A>) => Task<B>;
|
|
1524
1554
|
/**
|
|
1525
|
-
* Pattern matches on a
|
|
1555
|
+
* Pattern matches on a TaskMaybe, returning a Task of the result.
|
|
1526
1556
|
*
|
|
1527
1557
|
* @example
|
|
1528
1558
|
* ```ts
|
|
1529
1559
|
* pipe(
|
|
1530
1560
|
* findUser("123"),
|
|
1531
|
-
*
|
|
1561
|
+
* TaskMaybe.match({
|
|
1532
1562
|
* some: user => `Hello, ${user.name}`,
|
|
1533
1563
|
* none: () => "User not found"
|
|
1534
1564
|
* })
|
|
@@ -1538,33 +1568,33 @@ declare namespace TaskOption {
|
|
|
1538
1568
|
const match: <A, B>(cases: {
|
|
1539
1569
|
none: () => B;
|
|
1540
1570
|
some: (a: A) => B;
|
|
1541
|
-
}) => (data:
|
|
1571
|
+
}) => (data: TaskMaybe<A>) => Task<B>;
|
|
1542
1572
|
/**
|
|
1543
|
-
* Returns the value or a default if the
|
|
1573
|
+
* Returns the value or a default if the TaskMaybe resolves to None.
|
|
1544
1574
|
* The default can be a different type, widening the result to `Task<A | B>`.
|
|
1545
1575
|
*/
|
|
1546
|
-
const getOrElse: <A, B>(defaultValue: () => B) => (data:
|
|
1576
|
+
const getOrElse: <A, B>(defaultValue: () => B) => (data: TaskMaybe<A>) => Task<A | B>;
|
|
1547
1577
|
/**
|
|
1548
|
-
* Executes a side effect on the value without changing the
|
|
1578
|
+
* Executes a side effect on the value without changing the TaskMaybe.
|
|
1549
1579
|
* Useful for logging or debugging.
|
|
1550
1580
|
*/
|
|
1551
|
-
const tap: <A>(f: (a: A) => void) => (data:
|
|
1581
|
+
const tap: <A>(f: (a: A) => void) => (data: TaskMaybe<A>) => TaskMaybe<A>;
|
|
1552
1582
|
/**
|
|
1553
|
-
* Filters the value inside a
|
|
1583
|
+
* Filters the value inside a TaskMaybe. Returns None if the predicate fails.
|
|
1554
1584
|
*/
|
|
1555
|
-
const filter: <A>(predicate: (a: A) => boolean) => (data:
|
|
1585
|
+
const filter: <A>(predicate: (a: A) => boolean) => (data: TaskMaybe<A>) => TaskMaybe<A>;
|
|
1556
1586
|
/**
|
|
1557
|
-
* Converts a
|
|
1587
|
+
* Converts a TaskMaybe to a TaskResult, using onNone to produce the error value.
|
|
1558
1588
|
*
|
|
1559
1589
|
* @example
|
|
1560
1590
|
* ```ts
|
|
1561
1591
|
* pipe(
|
|
1562
1592
|
* findUser("123"),
|
|
1563
|
-
*
|
|
1593
|
+
* TaskMaybe.toTaskResult(() => "User not found")
|
|
1564
1594
|
* );
|
|
1565
1595
|
* ```
|
|
1566
1596
|
*/
|
|
1567
|
-
const toTaskResult: <E>(onNone: () => E) => <A>(data:
|
|
1597
|
+
const toTaskResult: <E>(onNone: () => E) => <A>(data: TaskMaybe<A>) => TaskResult<E, A>;
|
|
1568
1598
|
}
|
|
1569
1599
|
|
|
1570
1600
|
type Valid<A> = WithKind<"Valid"> & WithValue<A>;
|
|
@@ -2262,4 +2292,4 @@ declare namespace Tuple {
|
|
|
2262
2292
|
const tap: <A, B>(f: (a: A, b: B) => void) => (tuple: Tuple<A, B>) => Tuple<A, B>;
|
|
2263
2293
|
}
|
|
2264
2294
|
|
|
2265
|
-
export { type Failure, type Invalid, Lens, type Loading, Logged, type NotAsked,
|
|
2295
|
+
export { type Failure, type Invalid, Lens, type Loading, Logged, Maybe, type NotAsked, Optional, Predicate, Reader, Refinement, RemoteData, Resource, Result, State, type Success, Task, TaskMaybe, TaskResult, TaskValidation, These, type TheseBoth, type TheseFirst, type TheseSecond, Tuple, type Valid, Validation };
|