@nlozgachev/pipekit 0.1.8 → 0.3.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 +18 -13
- package/esm/src/Composition/flip.js +2 -2
- package/esm/src/Composition/fn.js +1 -1
- package/esm/src/Composition/tap.js +1 -1
- package/esm/src/Core/Arr.js +16 -16
- package/esm/src/Core/Option.js +27 -36
- package/esm/src/Core/Rec.js +1 -1
- package/esm/src/Core/RemoteData.js +9 -13
- package/esm/src/Core/Result.js +23 -32
- package/esm/src/Core/Task.js +95 -24
- package/esm/src/Core/TaskOption.js +8 -6
- package/esm/src/Core/TaskResult.js +67 -6
- package/esm/src/Core/TaskValidation.js +12 -8
- package/esm/src/Core/These.js +42 -42
- package/esm/src/Core/Validation.js +42 -43
- package/esm/src/Types/Brand.js +3 -3
- package/package.json +1 -1
- package/script/src/Composition/flip.js +2 -2
- package/script/src/Composition/fn.js +1 -1
- package/script/src/Composition/tap.js +1 -1
- package/script/src/Core/Arr.js +16 -16
- package/script/src/Core/Option.js +27 -36
- package/script/src/Core/Rec.js +1 -1
- package/script/src/Core/RemoteData.js +9 -13
- package/script/src/Core/Result.js +23 -32
- package/script/src/Core/Task.js +95 -24
- package/script/src/Core/TaskOption.js +8 -6
- package/script/src/Core/TaskResult.js +67 -6
- package/script/src/Core/TaskValidation.js +12 -8
- package/script/src/Core/These.js +42 -42
- package/script/src/Core/Validation.js +42 -43
- package/script/src/Types/Brand.js +3 -3
- package/types/src/Composition/flip.d.ts +2 -2
- package/types/src/Composition/fn.d.ts +1 -1
- package/types/src/Composition/pipe.d.ts +1 -1
- package/types/src/Composition/tap.d.ts +1 -1
- package/types/src/Composition/uncurry.d.ts +3 -3
- package/types/src/Core/Arr.d.ts +5 -5
- package/types/src/Core/Arr.d.ts.map +1 -1
- package/types/src/Core/Option.d.ts +21 -30
- package/types/src/Core/Option.d.ts.map +1 -1
- package/types/src/Core/Rec.d.ts.map +1 -1
- package/types/src/Core/RemoteData.d.ts +9 -13
- package/types/src/Core/RemoteData.d.ts.map +1 -1
- package/types/src/Core/Result.d.ts +19 -28
- package/types/src/Core/Result.d.ts.map +1 -1
- package/types/src/Core/Task.d.ts +81 -34
- package/types/src/Core/Task.d.ts.map +1 -1
- package/types/src/Core/TaskOption.d.ts +1 -1
- package/types/src/Core/TaskOption.d.ts.map +1 -1
- package/types/src/Core/TaskResult.d.ts +41 -2
- package/types/src/Core/TaskResult.d.ts.map +1 -1
- package/types/src/Core/TaskValidation.d.ts +10 -6
- package/types/src/Core/TaskValidation.d.ts.map +1 -1
- package/types/src/Core/These.d.ts +33 -33
- package/types/src/Core/These.d.ts.map +1 -1
- package/types/src/Core/Validation.d.ts +38 -42
- package/types/src/Core/Validation.d.ts.map +1 -1
- package/types/src/Types/Brand.d.ts +5 -5
|
@@ -6,56 +6,55 @@ export var Validation;
|
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```ts
|
|
9
|
-
* Validation.
|
|
9
|
+
* Validation.valid(42); // Valid(42)
|
|
10
10
|
* ```
|
|
11
11
|
*/
|
|
12
|
-
Validation.
|
|
12
|
+
Validation.valid = (value) => ({
|
|
13
13
|
kind: "Valid",
|
|
14
14
|
value,
|
|
15
15
|
});
|
|
16
16
|
/**
|
|
17
|
-
* Creates
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
*
|
|
17
|
+
* Creates an invalid Validation from a single error.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* Validation.invalid("Invalid input");
|
|
22
|
+
* ```
|
|
22
23
|
*/
|
|
23
|
-
Validation.
|
|
24
|
+
Validation.invalid = (error) => ({
|
|
25
|
+
kind: "Invalid",
|
|
26
|
+
errors: [error],
|
|
27
|
+
});
|
|
24
28
|
/**
|
|
25
|
-
* Creates an invalid Validation
|
|
29
|
+
* Creates an invalid Validation from multiple errors.
|
|
26
30
|
*
|
|
27
31
|
* @example
|
|
28
32
|
* ```ts
|
|
29
|
-
* Validation.
|
|
33
|
+
* Validation.invalidAll(["Invalid input"]);
|
|
30
34
|
* ```
|
|
31
35
|
*/
|
|
32
|
-
Validation.
|
|
36
|
+
Validation.invalidAll = (errors) => ({
|
|
33
37
|
kind: "Invalid",
|
|
34
38
|
errors,
|
|
35
39
|
});
|
|
36
40
|
/**
|
|
37
|
-
* Type guard that checks if a Validation is
|
|
41
|
+
* Type guard that checks if a Validation is valid.
|
|
38
42
|
*/
|
|
39
|
-
Validation.
|
|
43
|
+
Validation.isValid = (data) => data.kind === "Valid";
|
|
40
44
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```ts
|
|
45
|
-
* Validation.fail("Invalid input");
|
|
46
|
-
* ```
|
|
45
|
+
* Type guard that checks if a Validation is invalid.
|
|
47
46
|
*/
|
|
48
|
-
Validation.
|
|
47
|
+
Validation.isInvalid = (data) => data.kind === "Invalid";
|
|
49
48
|
/**
|
|
50
49
|
* Transforms the success value inside a Validation.
|
|
51
50
|
*
|
|
52
51
|
* @example
|
|
53
52
|
* ```ts
|
|
54
|
-
* pipe(Validation.
|
|
55
|
-
* pipe(Validation.
|
|
53
|
+
* pipe(Validation.valid(5), Validation.map(n => n * 2)); // Valid(10)
|
|
54
|
+
* pipe(Validation.invalid("oops"), Validation.map(n => n * 2)); // Invalid(["oops"])
|
|
56
55
|
* ```
|
|
57
56
|
*/
|
|
58
|
-
Validation.map = (f) => (data) => Validation.isValid(data) ? Validation.
|
|
57
|
+
Validation.map = (f) => (data) => Validation.isValid(data) ? Validation.valid(f(data.value)) : data;
|
|
59
58
|
/**
|
|
60
59
|
* Chains Validation computations. If the first is Valid, passes the value to f.
|
|
61
60
|
* If the first is Invalid, propagates the errors.
|
|
@@ -65,10 +64,10 @@ export var Validation;
|
|
|
65
64
|
* @example
|
|
66
65
|
* ```ts
|
|
67
66
|
* const validatePositive = (n: number): Validation<string, number> =>
|
|
68
|
-
* n > 0 ? Validation.
|
|
67
|
+
* n > 0 ? Validation.valid(n) : Validation.invalid("Must be positive");
|
|
69
68
|
*
|
|
70
|
-
* pipe(Validation.
|
|
71
|
-
* pipe(Validation.
|
|
69
|
+
* pipe(Validation.valid(5), Validation.chain(validatePositive)); // Valid(5)
|
|
70
|
+
* pipe(Validation.valid(-1), Validation.chain(validatePositive)); // Invalid(["Must be positive"])
|
|
72
71
|
* ```
|
|
73
72
|
*/
|
|
74
73
|
Validation.chain = (f) => (data) => Validation.isValid(data) ? f(data.value) : data;
|
|
@@ -80,26 +79,26 @@ export var Validation;
|
|
|
80
79
|
* ```ts
|
|
81
80
|
* const add = (a: number) => (b: number) => a + b;
|
|
82
81
|
* pipe(
|
|
83
|
-
* Validation.
|
|
84
|
-
* Validation.ap(Validation.
|
|
85
|
-
* Validation.ap(Validation.
|
|
82
|
+
* Validation.valid(add),
|
|
83
|
+
* Validation.ap(Validation.valid(5)),
|
|
84
|
+
* Validation.ap(Validation.valid(3))
|
|
86
85
|
* ); // Valid(8)
|
|
87
86
|
*
|
|
88
87
|
* pipe(
|
|
89
|
-
* Validation.
|
|
90
|
-
* Validation.ap(Validation.
|
|
91
|
-
* Validation.ap(Validation.
|
|
88
|
+
* Validation.valid(add),
|
|
89
|
+
* Validation.ap(Validation.invalid<string, number>("bad a")),
|
|
90
|
+
* Validation.ap(Validation.invalid<string, number>("bad b"))
|
|
92
91
|
* ); // Invalid(["bad a", "bad b"])
|
|
93
92
|
* ```
|
|
94
93
|
*/
|
|
95
94
|
Validation.ap = (arg) => (data) => {
|
|
96
95
|
if (Validation.isValid(data) && Validation.isValid(arg))
|
|
97
|
-
return Validation.
|
|
96
|
+
return Validation.valid(data.value(arg.value));
|
|
98
97
|
const errors = [
|
|
99
98
|
...(Validation.isInvalid(data) ? data.errors : []),
|
|
100
99
|
...(Validation.isInvalid(arg) ? arg.errors : []),
|
|
101
100
|
];
|
|
102
|
-
return isNonEmptyList(errors) ? Validation.
|
|
101
|
+
return isNonEmptyList(errors) ? Validation.invalidAll(errors) : Validation.valid(data);
|
|
103
102
|
};
|
|
104
103
|
/**
|
|
105
104
|
* Extracts the value from a Validation by providing handlers for both cases.
|
|
@@ -107,7 +106,7 @@ export var Validation;
|
|
|
107
106
|
* @example
|
|
108
107
|
* ```ts
|
|
109
108
|
* pipe(
|
|
110
|
-
* Validation.
|
|
109
|
+
* Validation.valid(42),
|
|
111
110
|
* Validation.fold(
|
|
112
111
|
* errors => `Errors: ${errors.join(", ")}`,
|
|
113
112
|
* value => `Value: ${value}`
|
|
@@ -136,8 +135,8 @@ export var Validation;
|
|
|
136
135
|
*
|
|
137
136
|
* @example
|
|
138
137
|
* ```ts
|
|
139
|
-
* pipe(Validation.
|
|
140
|
-
* pipe(Validation.
|
|
138
|
+
* pipe(Validation.valid(5), Validation.getOrElse(0)); // 5
|
|
139
|
+
* pipe(Validation.invalid("oops"), Validation.getOrElse(0)); // 0
|
|
141
140
|
* ```
|
|
142
141
|
*/
|
|
143
142
|
Validation.getOrElse = (defaultValue) => (data) => Validation.isValid(data) ? data.value : defaultValue;
|
|
@@ -147,7 +146,7 @@ export var Validation;
|
|
|
147
146
|
* @example
|
|
148
147
|
* ```ts
|
|
149
148
|
* pipe(
|
|
150
|
-
* Validation.
|
|
149
|
+
* Validation.valid(5),
|
|
151
150
|
* Validation.tap(n => console.log("Value:", n)),
|
|
152
151
|
* Validation.map(n => n * 2)
|
|
153
152
|
* );
|
|
@@ -177,13 +176,13 @@ export var Validation;
|
|
|
177
176
|
* @example
|
|
178
177
|
* ```ts
|
|
179
178
|
* Validation.combine(
|
|
180
|
-
* Validation.
|
|
181
|
-
* Validation.
|
|
179
|
+
* Validation.invalid("Error 1"),
|
|
180
|
+
* Validation.invalid("Error 2")
|
|
182
181
|
* ); // Invalid(["Error 1", "Error 2"])
|
|
183
182
|
*
|
|
184
183
|
* Validation.combine(
|
|
185
|
-
* Validation.
|
|
186
|
-
* Validation.
|
|
184
|
+
* Validation.valid("a"),
|
|
185
|
+
* Validation.valid("b")
|
|
187
186
|
* ); // Valid("b")
|
|
188
187
|
* ```
|
|
189
188
|
*/
|
|
@@ -195,7 +194,7 @@ export var Validation;
|
|
|
195
194
|
...(Validation.isInvalid(first) ? first.errors : []),
|
|
196
195
|
...(Validation.isInvalid(second) ? second.errors : []),
|
|
197
196
|
];
|
|
198
|
-
return isNonEmptyList(errors) ? Validation.
|
|
197
|
+
return isNonEmptyList(errors) ? Validation.invalidAll(errors) : second;
|
|
199
198
|
};
|
|
200
199
|
/**
|
|
201
200
|
* Combines multiple Validation instances, accumulating all errors.
|
package/esm/src/Types/Brand.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
export var Brand;
|
|
2
2
|
(function (Brand) {
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Returns a constructor that wraps a value of type T in brand K.
|
|
5
5
|
* The resulting function performs an unchecked cast — only use when the raw
|
|
6
6
|
* value is known to satisfy the brand's invariants.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* ```ts
|
|
10
10
|
* type PositiveNumber = Brand<"PositiveNumber", number>;
|
|
11
|
-
* const toPositiveNumber = Brand.
|
|
11
|
+
* const toPositiveNumber = Brand.wrap<"PositiveNumber", number>();
|
|
12
12
|
*
|
|
13
13
|
* const n: PositiveNumber = toPositiveNumber(42);
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
|
-
Brand.
|
|
16
|
+
Brand.wrap = () => (value) => value;
|
|
17
17
|
/**
|
|
18
18
|
* Strips the brand and returns the underlying value.
|
|
19
19
|
* Since Brand<K, T> extends T this is rarely needed, but can improve readability.
|
package/package.json
CHANGED
|
@@ -9,13 +9,13 @@ exports.flip = void 0;
|
|
|
9
9
|
* ```ts
|
|
10
10
|
* // Original data-last (for pipe)
|
|
11
11
|
* pipe(
|
|
12
|
-
* Option.
|
|
12
|
+
* Option.some(5),
|
|
13
13
|
* Option.map(n => n * 2)
|
|
14
14
|
* ); // Some(10)
|
|
15
15
|
*
|
|
16
16
|
* // Flipped to data-first
|
|
17
17
|
* const mapFirst = flip(Option.map);
|
|
18
|
-
* mapFirst(Option.
|
|
18
|
+
* mapFirst(Option.some(5))(n => n * 2); // Some(10)
|
|
19
19
|
* ```
|
|
20
20
|
*
|
|
21
21
|
* @see {@link uncurry} for converting curried functions to multi-argument functions
|
|
@@ -7,7 +7,7 @@ exports.once = exports.or = exports.and = exports.constVoid = exports.constUndef
|
|
|
7
7
|
* @example
|
|
8
8
|
* ```ts
|
|
9
9
|
* identity(42); // 42
|
|
10
|
-
* pipe(Option.
|
|
10
|
+
* pipe(Option.some(5), Option.fold(() => 0, identity)); // 5
|
|
11
11
|
* ```
|
|
12
12
|
*/
|
|
13
13
|
const identity = (a) => a;
|
package/script/src/Core/Arr.js
CHANGED
|
@@ -31,7 +31,7 @@ var Arr;
|
|
|
31
31
|
* Arr.head([]); // None
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
34
|
-
Arr.head = (data) => data.length > 0 ? Option_js_1.Option.
|
|
34
|
+
Arr.head = (data) => data.length > 0 ? Option_js_1.Option.some(data[0]) : Option_js_1.Option.none();
|
|
35
35
|
/**
|
|
36
36
|
* Returns the last element of an array, or None if the array is empty.
|
|
37
37
|
*
|
|
@@ -41,7 +41,7 @@ var Arr;
|
|
|
41
41
|
* Arr.last([]); // None
|
|
42
42
|
* ```
|
|
43
43
|
*/
|
|
44
|
-
Arr.last = (data) => data.length > 0 ? Option_js_1.Option.
|
|
44
|
+
Arr.last = (data) => data.length > 0 ? Option_js_1.Option.some(data[data.length - 1]) : Option_js_1.Option.none();
|
|
45
45
|
/**
|
|
46
46
|
* Returns all elements except the first, or None if the array is empty.
|
|
47
47
|
*
|
|
@@ -51,7 +51,7 @@ var Arr;
|
|
|
51
51
|
* Arr.tail([]); // None
|
|
52
52
|
* ```
|
|
53
53
|
*/
|
|
54
|
-
Arr.tail = (data) => data.length > 0 ? Option_js_1.Option.
|
|
54
|
+
Arr.tail = (data) => data.length > 0 ? Option_js_1.Option.some(data.slice(1)) : Option_js_1.Option.none();
|
|
55
55
|
/**
|
|
56
56
|
* Returns all elements except the last, or None if the array is empty.
|
|
57
57
|
*
|
|
@@ -61,7 +61,7 @@ var Arr;
|
|
|
61
61
|
* Arr.init([]); // None
|
|
62
62
|
* ```
|
|
63
63
|
*/
|
|
64
|
-
Arr.init = (data) => data.length > 0 ? Option_js_1.Option.
|
|
64
|
+
Arr.init = (data) => data.length > 0 ? Option_js_1.Option.some(data.slice(0, -1)) : Option_js_1.Option.none();
|
|
65
65
|
// --- Search ---
|
|
66
66
|
/**
|
|
67
67
|
* Returns the first element matching the predicate, or None.
|
|
@@ -73,7 +73,7 @@ var Arr;
|
|
|
73
73
|
*/
|
|
74
74
|
Arr.findFirst = (predicate) => (data) => {
|
|
75
75
|
const idx = data.findIndex(predicate);
|
|
76
|
-
return idx >= 0 ? Option_js_1.Option.
|
|
76
|
+
return idx >= 0 ? Option_js_1.Option.some(data[idx]) : Option_js_1.Option.none();
|
|
77
77
|
};
|
|
78
78
|
/**
|
|
79
79
|
* Returns the last element matching the predicate, or None.
|
|
@@ -86,9 +86,9 @@ var Arr;
|
|
|
86
86
|
Arr.findLast = (predicate) => (data) => {
|
|
87
87
|
for (let i = data.length - 1; i >= 0; i--) {
|
|
88
88
|
if (predicate(data[i]))
|
|
89
|
-
return Option_js_1.Option.
|
|
89
|
+
return Option_js_1.Option.some(data[i]);
|
|
90
90
|
}
|
|
91
|
-
return Option_js_1.Option.
|
|
91
|
+
return Option_js_1.Option.none();
|
|
92
92
|
};
|
|
93
93
|
/**
|
|
94
94
|
* Returns the index of the first element matching the predicate, or None.
|
|
@@ -100,7 +100,7 @@ var Arr;
|
|
|
100
100
|
*/
|
|
101
101
|
Arr.findIndex = (predicate) => (data) => {
|
|
102
102
|
const idx = data.findIndex(predicate);
|
|
103
|
-
return idx >= 0 ? Option_js_1.Option.
|
|
103
|
+
return idx >= 0 ? Option_js_1.Option.some(idx) : Option_js_1.Option.none();
|
|
104
104
|
};
|
|
105
105
|
// --- Transform ---
|
|
106
106
|
/**
|
|
@@ -306,7 +306,7 @@ var Arr;
|
|
|
306
306
|
* ```ts
|
|
307
307
|
* const parseNum = (s: string): Option<number> => {
|
|
308
308
|
* const n = Number(s);
|
|
309
|
-
* return isNaN(n) ? Option.
|
|
309
|
+
* return isNaN(n) ? Option.none() : Option.some(n);
|
|
310
310
|
* };
|
|
311
311
|
*
|
|
312
312
|
* pipe(["1", "2", "3"], Arr.traverse(parseNum)); // Some([1, 2, 3])
|
|
@@ -318,10 +318,10 @@ var Arr;
|
|
|
318
318
|
for (const a of data) {
|
|
319
319
|
const mapped = f(a);
|
|
320
320
|
if (Option_js_1.Option.isNone(mapped))
|
|
321
|
-
return Option_js_1.Option.
|
|
321
|
+
return Option_js_1.Option.none();
|
|
322
322
|
result.push(mapped.value);
|
|
323
323
|
}
|
|
324
|
-
return Option_js_1.Option.
|
|
324
|
+
return Option_js_1.Option.some(result);
|
|
325
325
|
};
|
|
326
326
|
/**
|
|
327
327
|
* Maps each element to a Result and collects the results.
|
|
@@ -331,7 +331,7 @@ var Arr;
|
|
|
331
331
|
* ```ts
|
|
332
332
|
* pipe(
|
|
333
333
|
* [1, 2, 3],
|
|
334
|
-
* Arr.traverseResult(n => n > 0 ? Result.
|
|
334
|
+
* Arr.traverseResult(n => n > 0 ? Result.ok(n) : Result.err("negative"))
|
|
335
335
|
* ); // Ok([1, 2, 3])
|
|
336
336
|
* ```
|
|
337
337
|
*/
|
|
@@ -343,7 +343,7 @@ var Arr;
|
|
|
343
343
|
return mapped;
|
|
344
344
|
result.push(mapped.value);
|
|
345
345
|
}
|
|
346
|
-
return Result_js_1.Result.
|
|
346
|
+
return Result_js_1.Result.ok(result);
|
|
347
347
|
};
|
|
348
348
|
/**
|
|
349
349
|
* Maps each element to a Task and runs all in parallel.
|
|
@@ -352,7 +352,7 @@ var Arr;
|
|
|
352
352
|
* ```ts
|
|
353
353
|
* pipe(
|
|
354
354
|
* [1, 2, 3],
|
|
355
|
-
* Arr.traverseTask(n => Task.
|
|
355
|
+
* Arr.traverseTask(n => Task.resolve(n * 2))
|
|
356
356
|
* )(); // Promise<[2, 4, 6]>
|
|
357
357
|
* ```
|
|
358
358
|
*/
|
|
@@ -363,8 +363,8 @@ var Arr;
|
|
|
363
363
|
*
|
|
364
364
|
* @example
|
|
365
365
|
* ```ts
|
|
366
|
-
* Arr.sequence([Option.
|
|
367
|
-
* Arr.sequence([Option.
|
|
366
|
+
* Arr.sequence([Option.some(1), Option.some(2)]); // Some([1, 2])
|
|
367
|
+
* Arr.sequence([Option.some(1), Option.none()]); // None
|
|
368
368
|
* ```
|
|
369
369
|
*/
|
|
370
370
|
Arr.sequence = (data) => Arr.traverse((a) => a)(data);
|
|
@@ -4,19 +4,10 @@ exports.Option = void 0;
|
|
|
4
4
|
const Result_js_1 = require("./Result.js");
|
|
5
5
|
var Option;
|
|
6
6
|
(function (Option) {
|
|
7
|
-
/**
|
|
8
|
-
* Wraps a value in a Some.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* Option.of(42); // Some(42)
|
|
13
|
-
* ```
|
|
14
|
-
*/
|
|
15
|
-
Option.of = (value) => Option.toSome(value);
|
|
16
7
|
/**
|
|
17
8
|
* Creates a Some containing the given value.
|
|
18
9
|
*/
|
|
19
|
-
Option.
|
|
10
|
+
Option.some = (value) => ({ kind: "Some", value });
|
|
20
11
|
/**
|
|
21
12
|
* Type guard that checks if a Option is Some.
|
|
22
13
|
*/
|
|
@@ -24,7 +15,7 @@ var Option;
|
|
|
24
15
|
/**
|
|
25
16
|
* Creates a None (empty Option).
|
|
26
17
|
*/
|
|
27
|
-
Option.
|
|
18
|
+
Option.none = () => ({ kind: "None" });
|
|
28
19
|
/**
|
|
29
20
|
* Type guard that checks if a Option is None.
|
|
30
21
|
*/
|
|
@@ -39,7 +30,7 @@ var Option;
|
|
|
39
30
|
* Option.fromNullable(42); // Some(42)
|
|
40
31
|
* ```
|
|
41
32
|
*/
|
|
42
|
-
Option.fromNullable = (value) => value === null || value === undefined ? Option.
|
|
33
|
+
Option.fromNullable = (value) => value === null || value === undefined ? Option.none() : Option.some(value);
|
|
43
34
|
/**
|
|
44
35
|
* Extracts the value from a Option, returning null if None.
|
|
45
36
|
*/
|
|
@@ -52,7 +43,7 @@ var Option;
|
|
|
52
43
|
* Creates a Option from a possibly undefined value.
|
|
53
44
|
* Returns None if undefined, Some otherwise.
|
|
54
45
|
*/
|
|
55
|
-
Option.fromUndefined = (value) => value === undefined ? Option.
|
|
46
|
+
Option.fromUndefined = (value) => value === undefined ? Option.none() : Option.some(value);
|
|
56
47
|
/**
|
|
57
48
|
* Converts an Option to a Result.
|
|
58
49
|
* Some becomes Ok, None becomes Err with the provided error.
|
|
@@ -60,38 +51,38 @@ var Option;
|
|
|
60
51
|
* @example
|
|
61
52
|
* ```ts
|
|
62
53
|
* pipe(
|
|
63
|
-
* Option.
|
|
54
|
+
* Option.some(42),
|
|
64
55
|
* Option.toResult(() => "Value was missing")
|
|
65
56
|
* ); // Ok(42)
|
|
66
57
|
*
|
|
67
58
|
* pipe(
|
|
68
|
-
* Option.
|
|
59
|
+
* Option.none(),
|
|
69
60
|
* Option.toResult(() => "Value was missing")
|
|
70
61
|
* ); // Err("Value was missing")
|
|
71
62
|
* ```
|
|
72
63
|
*/
|
|
73
|
-
Option.toResult = (onNone) => (data) => Option.isSome(data) ? Result_js_1.Result.
|
|
64
|
+
Option.toResult = (onNone) => (data) => Option.isSome(data) ? Result_js_1.Result.ok(data.value) : Result_js_1.Result.err(onNone());
|
|
74
65
|
/**
|
|
75
66
|
* Creates an Option from a Result.
|
|
76
67
|
* Ok becomes Some, Err becomes None (the error is discarded).
|
|
77
68
|
*
|
|
78
69
|
* @example
|
|
79
70
|
* ```ts
|
|
80
|
-
* Option.fromResult(Result.
|
|
81
|
-
* Option.fromResult(Result.
|
|
71
|
+
* Option.fromResult(Result.ok(42)); // Some(42)
|
|
72
|
+
* Option.fromResult(Result.err("oops")); // None
|
|
82
73
|
* ```
|
|
83
74
|
*/
|
|
84
|
-
Option.fromResult = (data) => Result_js_1.Result.isOk(data) ? Option.
|
|
75
|
+
Option.fromResult = (data) => Result_js_1.Result.isOk(data) ? Option.some(data.value) : Option.none();
|
|
85
76
|
/**
|
|
86
77
|
* Transforms the value inside a Option if it exists.
|
|
87
78
|
*
|
|
88
79
|
* @example
|
|
89
80
|
* ```ts
|
|
90
|
-
* pipe(Option.
|
|
91
|
-
* pipe(Option.
|
|
81
|
+
* pipe(Option.some(5), Option.map(n => n * 2)); // Some(10)
|
|
82
|
+
* pipe(Option.none(), Option.map(n => n * 2)); // None
|
|
92
83
|
* ```
|
|
93
84
|
*/
|
|
94
|
-
Option.map = (f) => (data) => Option.isSome(data) ? Option.
|
|
85
|
+
Option.map = (f) => (data) => Option.isSome(data) ? Option.some(f(data.value)) : data;
|
|
95
86
|
/**
|
|
96
87
|
* Chains Option computations. If the first is Some, passes the value to f.
|
|
97
88
|
* If the first is None, propagates None.
|
|
@@ -100,11 +91,11 @@ var Option;
|
|
|
100
91
|
* ```ts
|
|
101
92
|
* const parseNumber = (s: string): Option<number> => {
|
|
102
93
|
* const n = parseInt(s, 10);
|
|
103
|
-
* return isNaN(n) ? Option.
|
|
94
|
+
* return isNaN(n) ? Option.none() : Option.some(n);
|
|
104
95
|
* };
|
|
105
96
|
*
|
|
106
|
-
* pipe(Option.
|
|
107
|
-
* pipe(Option.
|
|
97
|
+
* pipe(Option.some("42"), Option.chain(parseNumber)); // Some(42)
|
|
98
|
+
* pipe(Option.some("abc"), Option.chain(parseNumber)); // None
|
|
108
99
|
* ```
|
|
109
100
|
*/
|
|
110
101
|
Option.chain = (f) => (data) => Option.isSome(data) ? f(data.value) : data;
|
|
@@ -114,7 +105,7 @@ var Option;
|
|
|
114
105
|
* @example
|
|
115
106
|
* ```ts
|
|
116
107
|
* pipe(
|
|
117
|
-
* Option.
|
|
108
|
+
* Option.some(5),
|
|
118
109
|
* Option.fold(
|
|
119
110
|
* () => "No value",
|
|
120
111
|
* n => `Value: ${n}`
|
|
@@ -143,8 +134,8 @@ var Option;
|
|
|
143
134
|
*
|
|
144
135
|
* @example
|
|
145
136
|
* ```ts
|
|
146
|
-
* pipe(Option.
|
|
147
|
-
* pipe(Option.
|
|
137
|
+
* pipe(Option.some(5), Option.getOrElse(0)); // 5
|
|
138
|
+
* pipe(Option.none(), Option.getOrElse(0)); // 0
|
|
148
139
|
* ```
|
|
149
140
|
*/
|
|
150
141
|
Option.getOrElse = (defaultValue) => (data) => Option.isSome(data) ? data.value : defaultValue;
|
|
@@ -155,7 +146,7 @@ var Option;
|
|
|
155
146
|
* @example
|
|
156
147
|
* ```ts
|
|
157
148
|
* pipe(
|
|
158
|
-
* Option.
|
|
149
|
+
* Option.some(5),
|
|
159
150
|
* Option.tap(n => console.log("Value:", n)),
|
|
160
151
|
* Option.map(n => n * 2)
|
|
161
152
|
* );
|
|
@@ -172,11 +163,11 @@ var Option;
|
|
|
172
163
|
*
|
|
173
164
|
* @example
|
|
174
165
|
* ```ts
|
|
175
|
-
* pipe(Option.
|
|
176
|
-
* pipe(Option.
|
|
166
|
+
* pipe(Option.some(5), Option.filter(n => n > 3)); // Some(5)
|
|
167
|
+
* pipe(Option.some(2), Option.filter(n => n > 3)); // None
|
|
177
168
|
* ```
|
|
178
169
|
*/
|
|
179
|
-
Option.filter = (predicate) => (data) => Option.isSome(data) && predicate(data.value) ? data : Option.
|
|
170
|
+
Option.filter = (predicate) => (data) => Option.isSome(data) && predicate(data.value) ? data : Option.none();
|
|
180
171
|
/**
|
|
181
172
|
* Recovers from a None by providing a fallback Option.
|
|
182
173
|
*/
|
|
@@ -188,11 +179,11 @@ var Option;
|
|
|
188
179
|
* ```ts
|
|
189
180
|
* const add = (a: number) => (b: number) => a + b;
|
|
190
181
|
* pipe(
|
|
191
|
-
* Option.
|
|
192
|
-
* Option.ap(Option.
|
|
193
|
-
* Option.ap(Option.
|
|
182
|
+
* Option.some(add),
|
|
183
|
+
* Option.ap(Option.some(5)),
|
|
184
|
+
* Option.ap(Option.some(3))
|
|
194
185
|
* ); // Some(8)
|
|
195
186
|
* ```
|
|
196
187
|
*/
|
|
197
|
-
Option.ap = (arg) => (data) => Option.isSome(data) && Option.isSome(arg) ? Option.
|
|
188
|
+
Option.ap = (arg) => (data) => Option.isSome(data) && Option.isSome(arg) ? Option.some(data.value(arg.value)) : Option.none();
|
|
198
189
|
})(Option || (exports.Option = Option = {}));
|
package/script/src/Core/Rec.js
CHANGED
|
@@ -90,7 +90,7 @@ var Rec;
|
|
|
90
90
|
* pipe({ a: 1, b: 2 }, Rec.lookup("c")); // None
|
|
91
91
|
* ```
|
|
92
92
|
*/
|
|
93
|
-
Rec.lookup = (key) => (data) => Object.prototype.hasOwnProperty.call(data, key) ? Option_js_1.Option.
|
|
93
|
+
Rec.lookup = (key) => (data) => Object.prototype.hasOwnProperty.call(data, key) ? Option_js_1.Option.some(data[key]) : Option_js_1.Option.none();
|
|
94
94
|
/**
|
|
95
95
|
* Returns all keys of a record.
|
|
96
96
|
*/
|
|
@@ -25,10 +25,6 @@ var RemoteData;
|
|
|
25
25
|
kind: "Success",
|
|
26
26
|
value,
|
|
27
27
|
});
|
|
28
|
-
/**
|
|
29
|
-
* Wraps a value in a Success RemoteData. Alias for `success`.
|
|
30
|
-
*/
|
|
31
|
-
RemoteData.of = RemoteData.success;
|
|
32
28
|
/**
|
|
33
29
|
* Type guard that checks if a RemoteData is NotAsked.
|
|
34
30
|
*/
|
|
@@ -50,7 +46,7 @@ var RemoteData;
|
|
|
50
46
|
*
|
|
51
47
|
* @example
|
|
52
48
|
* ```ts
|
|
53
|
-
* pipe(RemoteData.
|
|
49
|
+
* pipe(RemoteData.success(5), RemoteData.map(n => n * 2)); // Success(10)
|
|
54
50
|
* pipe(RemoteData.loading(), RemoteData.map(n => n * 2)); // Loading
|
|
55
51
|
* ```
|
|
56
52
|
*/
|
|
@@ -71,8 +67,8 @@ var RemoteData;
|
|
|
71
67
|
* @example
|
|
72
68
|
* ```ts
|
|
73
69
|
* pipe(
|
|
74
|
-
* RemoteData.
|
|
75
|
-
* RemoteData.chain(n => n > 0 ? RemoteData.
|
|
70
|
+
* RemoteData.success(5),
|
|
71
|
+
* RemoteData.chain(n => n > 0 ? RemoteData.success(n) : RemoteData.failure("negative"))
|
|
76
72
|
* );
|
|
77
73
|
* ```
|
|
78
74
|
*/
|
|
@@ -84,9 +80,9 @@ var RemoteData;
|
|
|
84
80
|
* ```ts
|
|
85
81
|
* const add = (a: number) => (b: number) => a + b;
|
|
86
82
|
* pipe(
|
|
87
|
-
* RemoteData.
|
|
88
|
-
* RemoteData.ap(RemoteData.
|
|
89
|
-
* RemoteData.ap(RemoteData.
|
|
83
|
+
* RemoteData.success(add),
|
|
84
|
+
* RemoteData.ap(RemoteData.success(5)),
|
|
85
|
+
* RemoteData.ap(RemoteData.success(3))
|
|
90
86
|
* ); // Success(8)
|
|
91
87
|
* ```
|
|
92
88
|
*/
|
|
@@ -163,7 +159,7 @@ var RemoteData;
|
|
|
163
159
|
*
|
|
164
160
|
* @example
|
|
165
161
|
* ```ts
|
|
166
|
-
* pipe(RemoteData.
|
|
162
|
+
* pipe(RemoteData.success(5), RemoteData.getOrElse(0)); // 5
|
|
167
163
|
* pipe(RemoteData.loading(), RemoteData.getOrElse(0)); // 0
|
|
168
164
|
* ```
|
|
169
165
|
*/
|
|
@@ -174,7 +170,7 @@ var RemoteData;
|
|
|
174
170
|
* @example
|
|
175
171
|
* ```ts
|
|
176
172
|
* pipe(
|
|
177
|
-
* RemoteData.
|
|
173
|
+
* RemoteData.success(5),
|
|
178
174
|
* RemoteData.tap(n => console.log("Value:", n)),
|
|
179
175
|
* RemoteData.map(n => n * 2)
|
|
180
176
|
* );
|
|
@@ -202,7 +198,7 @@ var RemoteData;
|
|
|
202
198
|
* @example
|
|
203
199
|
* ```ts
|
|
204
200
|
* pipe(
|
|
205
|
-
* RemoteData.
|
|
201
|
+
* RemoteData.success(42),
|
|
206
202
|
* RemoteData.toResult(() => "not loaded")
|
|
207
203
|
* ); // Ok(42)
|
|
208
204
|
* ```
|