@satoshibits/functional 1.0.3 → 1.1.2
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 +28 -145
- package/dist/array-utils.d.mts +13 -0
- package/dist/array-utils.d.mts.map +1 -1
- package/dist/array-utils.mjs +19 -3
- package/dist/array-utils.mjs.map +1 -1
- package/dist/array-utils.test.d.ts +2 -0
- package/dist/array-utils.test.d.ts.map +1 -0
- package/dist/array-utils.test.js +256 -0
- package/dist/array-utils.test.js.map +1 -0
- package/dist/composition.d.mts +53 -6
- package/dist/composition.d.mts.map +1 -1
- package/dist/composition.mjs +111 -22
- package/dist/composition.mjs.map +1 -1
- package/dist/composition.test.d.ts +2 -0
- package/dist/composition.test.d.ts.map +1 -0
- package/dist/composition.test.js +409 -0
- package/dist/composition.test.js.map +1 -0
- package/dist/index.d.mts +10 -5
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +10 -5
- package/dist/index.mjs.map +1 -1
- package/dist/integration.test.d.mts +2 -0
- package/dist/integration.test.d.mts.map +1 -0
- package/dist/integration.test.mjs +486 -0
- package/dist/integration.test.mjs.map +1 -0
- package/dist/io.d.mts +338 -0
- package/dist/io.d.mts.map +1 -0
- package/dist/io.mjs +389 -0
- package/dist/io.mjs.map +1 -0
- package/dist/io.test.d.mts +2 -0
- package/dist/io.test.d.mts.map +1 -0
- package/dist/io.test.mjs +373 -0
- package/dist/io.test.mjs.map +1 -0
- package/dist/laws.test.d.mts +2 -0
- package/dist/laws.test.d.mts.map +1 -0
- package/dist/laws.test.mjs +614 -0
- package/dist/laws.test.mjs.map +1 -0
- package/dist/object-utils.d.mts +11 -0
- package/dist/object-utils.d.mts.map +1 -1
- package/dist/object-utils.mjs +11 -0
- package/dist/object-utils.mjs.map +1 -1
- package/dist/object-utils.test.d.ts +2 -0
- package/dist/object-utils.test.d.ts.map +1 -0
- package/dist/object-utils.test.js +286 -0
- package/dist/object-utils.test.js.map +1 -0
- package/dist/option-additions.test.d.mts +2 -0
- package/dist/option-additions.test.d.mts.map +1 -0
- package/dist/option-additions.test.mjs +325 -0
- package/dist/option-additions.test.mjs.map +1 -0
- package/dist/option.d.mts +202 -58
- package/dist/option.d.mts.map +1 -1
- package/dist/option.mjs +271 -63
- package/dist/option.mjs.map +1 -1
- package/dist/option.test.d.ts +6 -0
- package/dist/option.test.d.ts.map +1 -0
- package/dist/option.test.js +606 -0
- package/dist/option.test.js.map +1 -0
- package/dist/performance.d.mts +27 -10
- package/dist/performance.d.mts.map +1 -1
- package/dist/performance.mjs +42 -20
- package/dist/performance.mjs.map +1 -1
- package/dist/performance.test.d.ts +2 -0
- package/dist/performance.test.d.ts.map +1 -0
- package/dist/performance.test.js +424 -0
- package/dist/performance.test.js.map +1 -0
- package/dist/pipeline.d.mts +12 -0
- package/dist/pipeline.d.mts.map +1 -1
- package/dist/pipeline.mjs +12 -0
- package/dist/pipeline.mjs.map +1 -1
- package/dist/pipeline.test.d.ts +2 -0
- package/dist/pipeline.test.d.ts.map +1 -0
- package/dist/pipeline.test.js +445 -0
- package/dist/pipeline.test.js.map +1 -0
- package/dist/predicates.d.mts +12 -0
- package/dist/predicates.d.mts.map +1 -1
- package/dist/predicates.mjs +12 -0
- package/dist/predicates.mjs.map +1 -1
- package/dist/predicates.test.d.ts +2 -0
- package/dist/predicates.test.d.ts.map +1 -0
- package/dist/predicates.test.js +375 -0
- package/dist/predicates.test.js.map +1 -0
- package/dist/reader-result.d.mts +37 -16
- package/dist/reader-result.d.mts.map +1 -1
- package/dist/reader-result.mjs +37 -16
- package/dist/reader-result.mjs.map +1 -1
- package/dist/reader-result.test.d.ts +2 -0
- package/dist/reader-result.test.d.ts.map +1 -0
- package/dist/reader-result.test.js +1259 -0
- package/dist/reader-result.test.js.map +1 -0
- package/dist/reader.d.mts +443 -0
- package/dist/reader.d.mts.map +1 -0
- package/dist/reader.mjs +456 -0
- package/dist/reader.mjs.map +1 -0
- package/dist/reader.test.d.mts +2 -0
- package/dist/reader.test.d.mts.map +1 -0
- package/dist/reader.test.mjs +288 -0
- package/dist/reader.test.mjs.map +1 -0
- package/dist/result-additions.test.d.mts +2 -0
- package/dist/result-additions.test.d.mts.map +1 -0
- package/dist/result-additions.test.mjs +325 -0
- package/dist/result-additions.test.mjs.map +1 -0
- package/dist/result.d.mts +208 -0
- package/dist/result.d.mts.map +1 -1
- package/dist/result.mjs +287 -0
- package/dist/result.mjs.map +1 -1
- package/dist/result.test.d.ts +2 -0
- package/dist/result.test.d.ts.map +1 -0
- package/dist/result.test.js +453 -0
- package/dist/result.test.js.map +1 -0
- package/dist/task.d.mts +374 -0
- package/dist/task.d.mts.map +1 -0
- package/dist/task.mjs +386 -0
- package/dist/task.mjs.map +1 -0
- package/dist/task.test.d.mts +2 -0
- package/dist/task.test.d.mts.map +1 -0
- package/dist/task.test.mjs +1006 -0
- package/dist/task.test.mjs.map +1 -0
- package/dist/types.d.mts +12 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +12 -0
- package/dist/types.mjs.map +1 -1
- package/dist/types.test.d.ts +6 -0
- package/dist/types.test.d.ts.map +1 -0
- package/dist/types.test.js +447 -0
- package/dist/types.test.js.map +1 -0
- package/dist/validation.d.mts +12 -0
- package/dist/validation.d.mts.map +1 -1
- package/dist/validation.mjs +22 -4
- package/dist/validation.mjs.map +1 -1
- package/dist/validation.test.d.ts +2 -0
- package/dist/validation.test.d.ts.map +1 -0
- package/dist/validation.test.js +518 -0
- package/dist/validation.test.js.map +1 -0
- package/package.json +77 -13
package/dist/option.mjs
CHANGED
|
@@ -6,6 +6,18 @@
|
|
|
6
6
|
* Forces explicit handling of edge cases and eliminates null pointer exceptions.
|
|
7
7
|
* Inspired by functional programming languages like Haskell and Rust.
|
|
8
8
|
*
|
|
9
|
+
* ### For Dummies
|
|
10
|
+
* - An `Option` is either "Some value" or "None"—no surprises, no `null` pitfalls.
|
|
11
|
+
* - You poke at it with helper functions instead of checking for `null` everywhere.
|
|
12
|
+
* - When you finally need a real value, you decide how to handle the empty case explicitly.
|
|
13
|
+
*
|
|
14
|
+
* ### Decision Tree
|
|
15
|
+
* - Have a definite value? Wrap it with `Option.some(value)`.
|
|
16
|
+
* - Unsure if a value exists? Use `Option.fromNullable(maybeValue)`.
|
|
17
|
+
* - Transforming without changing emptiness? Use `Option.map(fn)`.
|
|
18
|
+
* - Need the next step to also be optional? Use `Option.flatMap(fnReturningOption)`.
|
|
19
|
+
* - Want a default? Call `Option.getOrElse(() => fallback)(option)` at the edge.
|
|
20
|
+
*
|
|
9
21
|
* @example
|
|
10
22
|
* ```typescript
|
|
11
23
|
* import { Option, some, none, fromNullable, map, getOrElse } from './option.mts';
|
|
@@ -33,6 +45,17 @@
|
|
|
33
45
|
* @category Core
|
|
34
46
|
* @since 2025-07-03
|
|
35
47
|
*/
|
|
48
|
+
var __assign = (this && this.__assign) || function () {
|
|
49
|
+
__assign = Object.assign || function(t) {
|
|
50
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
51
|
+
s = arguments[i];
|
|
52
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
53
|
+
t[p] = s[p];
|
|
54
|
+
}
|
|
55
|
+
return t;
|
|
56
|
+
};
|
|
57
|
+
return __assign.apply(this, arguments);
|
|
58
|
+
};
|
|
36
59
|
/**
|
|
37
60
|
* Creates a Some variant containing the provided value.
|
|
38
61
|
* @description Wraps a value in the Some variant of Option.
|
|
@@ -64,7 +87,7 @@
|
|
|
64
87
|
* @since 2025-07-03
|
|
65
88
|
*/
|
|
66
89
|
export var some = function (value) { return ({
|
|
67
|
-
_tag:
|
|
90
|
+
_tag: "Some",
|
|
68
91
|
value: value,
|
|
69
92
|
}); };
|
|
70
93
|
/**
|
|
@@ -94,7 +117,7 @@ export var some = function (value) { return ({
|
|
|
94
117
|
* @since 2025-07-03
|
|
95
118
|
*/
|
|
96
119
|
export var none = function () { return ({
|
|
97
|
-
_tag:
|
|
120
|
+
_tag: "None",
|
|
98
121
|
}); };
|
|
99
122
|
/**
|
|
100
123
|
* Creates an Option from a nullable value.
|
|
@@ -173,7 +196,7 @@ export var fromPredicate = function (predicate) {
|
|
|
173
196
|
* return processValue(result.value);
|
|
174
197
|
*/
|
|
175
198
|
export var isSome = function (option) {
|
|
176
|
-
return option._tag ===
|
|
199
|
+
return option._tag === "Some";
|
|
177
200
|
};
|
|
178
201
|
/**
|
|
179
202
|
* Type guard to check if an Option is None.
|
|
@@ -199,7 +222,7 @@ export var isSome = function (option) {
|
|
|
199
222
|
* }
|
|
200
223
|
*/
|
|
201
224
|
export var isNone = function (option) {
|
|
202
|
-
return option._tag ===
|
|
225
|
+
return option._tag === "None";
|
|
203
226
|
};
|
|
204
227
|
/**
|
|
205
228
|
* Maps a function over the value in Some, does nothing for None.
|
|
@@ -248,8 +271,10 @@ export var map = function (fn) {
|
|
|
248
271
|
* @example
|
|
249
272
|
* // Chaining optional operations
|
|
250
273
|
* const getManager = (employee: Employee) =>
|
|
251
|
-
*
|
|
252
|
-
* .
|
|
274
|
+
* pipe(
|
|
275
|
+
* Option.fromNullable(employee.managerId),
|
|
276
|
+
* Option.flatMap(id => findEmployee(id)),
|
|
277
|
+
* );
|
|
253
278
|
*
|
|
254
279
|
* @example
|
|
255
280
|
* // Validation chain
|
|
@@ -450,16 +475,16 @@ export var tryCatch = function (fn) {
|
|
|
450
475
|
* @example
|
|
451
476
|
* const logValue = pipe(
|
|
452
477
|
* Option.some(42),
|
|
453
|
-
* Option.
|
|
478
|
+
* Option.tapOption(value => console.log('Found value:', value))
|
|
454
479
|
* ); // logs "Found value: 42" and returns Some(42)
|
|
455
480
|
*
|
|
456
481
|
* @example
|
|
457
482
|
* // Debug logging in a chain
|
|
458
483
|
* const result = pipe(
|
|
459
484
|
* getUserInput(),
|
|
460
|
-
* Option.
|
|
485
|
+
* Option.tapOption(input => console.log('Raw input:', input)),
|
|
461
486
|
* Option.map(normalize),
|
|
462
|
-
* Option.
|
|
487
|
+
* Option.tapOption(normalized => console.log('Normalized:', normalized)),
|
|
463
488
|
* Option.filter(isValid)
|
|
464
489
|
* );
|
|
465
490
|
*
|
|
@@ -467,10 +492,10 @@ export var tryCatch = function (fn) {
|
|
|
467
492
|
* // Side effects like analytics
|
|
468
493
|
* const trackEvent = pipe(
|
|
469
494
|
* findUser(id),
|
|
470
|
-
* Option.
|
|
495
|
+
* Option.tapOption(user => analytics.track('user.found', { id: user.id }))
|
|
471
496
|
* );
|
|
472
497
|
*/
|
|
473
|
-
export var
|
|
498
|
+
export var tapOption = function (fn) {
|
|
474
499
|
return function (option) {
|
|
475
500
|
if (isSome(option)) {
|
|
476
501
|
fn(option.value);
|
|
@@ -478,30 +503,6 @@ export var tap = function (fn) {
|
|
|
478
503
|
return option;
|
|
479
504
|
};
|
|
480
505
|
};
|
|
481
|
-
/**
|
|
482
|
-
* Namespace containing all Option utilities.
|
|
483
|
-
*
|
|
484
|
-
* @category Namespace
|
|
485
|
-
*/
|
|
486
|
-
export var Option = {
|
|
487
|
-
some: some,
|
|
488
|
-
none: none,
|
|
489
|
-
fromNullable: fromNullable,
|
|
490
|
-
fromPredicate: fromPredicate,
|
|
491
|
-
tryCatch: tryCatch,
|
|
492
|
-
isSome: isSome,
|
|
493
|
-
isNone: isNone,
|
|
494
|
-
map: map,
|
|
495
|
-
flatMap: flatMap,
|
|
496
|
-
chain: chain,
|
|
497
|
-
getOrElse: getOrElse,
|
|
498
|
-
orElse: orElse,
|
|
499
|
-
filter: filter,
|
|
500
|
-
tap: tap,
|
|
501
|
-
match: match,
|
|
502
|
-
toNullable: toNullable,
|
|
503
|
-
toUndefined: toUndefined,
|
|
504
|
-
};
|
|
505
506
|
/**
|
|
506
507
|
* Combines two Options using a binary function.
|
|
507
508
|
* Returns None if either Option is None.
|
|
@@ -538,7 +539,7 @@ export var lift2 = function (fn) {
|
|
|
538
539
|
*
|
|
539
540
|
* @category Combinations
|
|
540
541
|
* @example
|
|
541
|
-
* const results =
|
|
542
|
+
* const results = sequenceOption([
|
|
542
543
|
* Option.some(1),
|
|
543
544
|
* Option.some(2),
|
|
544
545
|
* Option.some(3)
|
|
@@ -547,19 +548,19 @@ export var lift2 = function (fn) {
|
|
|
547
548
|
*
|
|
548
549
|
* @example
|
|
549
550
|
* // Parse multiple values
|
|
550
|
-
* const numbers =
|
|
551
|
+
* const numbers = sequenceOption(
|
|
551
552
|
* inputs.map(input => parseNumber(input))
|
|
552
553
|
* );
|
|
553
554
|
*
|
|
554
555
|
* @example
|
|
555
556
|
* // Validate all fields
|
|
556
|
-
* const validatedFields =
|
|
557
|
+
* const validatedFields = sequenceOption([
|
|
557
558
|
* validateField('name', data.name),
|
|
558
559
|
* validateField('email', data.email),
|
|
559
560
|
* validateField('age', data.age)
|
|
560
561
|
* ]);
|
|
561
562
|
*/
|
|
562
|
-
export var
|
|
563
|
+
export var sequenceOption = function (options) {
|
|
563
564
|
var results = [];
|
|
564
565
|
for (var _i = 0, options_1 = options; _i < options_1.length; _i++) {
|
|
565
566
|
var option = options_1[_i];
|
|
@@ -570,29 +571,6 @@ export var sequence = function (options) {
|
|
|
570
571
|
}
|
|
571
572
|
return some(results);
|
|
572
573
|
};
|
|
573
|
-
/**
|
|
574
|
-
* Applies a function wrapped in an Option to a value wrapped in an Option.
|
|
575
|
-
*
|
|
576
|
-
* @category Apply
|
|
577
|
-
* @example
|
|
578
|
-
* const addOne = (n: number) => n + 1;
|
|
579
|
-
* const result = ap(Option.some(addOne))(Option.some(5));
|
|
580
|
-
* // => Some(6)
|
|
581
|
-
*
|
|
582
|
-
* @example
|
|
583
|
-
* // Partial application with options
|
|
584
|
-
* const add = (a: number) => (b: number) => a + b;
|
|
585
|
-
* const maybeAdd5 = Option.map(add)(Option.some(5));
|
|
586
|
-
* const result = ap(maybeAdd5)(Option.some(3));
|
|
587
|
-
* // => Some(8)
|
|
588
|
-
*/
|
|
589
|
-
export var ap = function (optionFn) {
|
|
590
|
-
return function (optionA) {
|
|
591
|
-
return isSome(optionFn) && isSome(optionA)
|
|
592
|
-
? some(optionFn.value(optionA.value))
|
|
593
|
-
: none();
|
|
594
|
-
};
|
|
595
|
-
};
|
|
596
574
|
/**
|
|
597
575
|
* Sequences a struct of Options into an Option of a struct.
|
|
598
576
|
* Returns Some with the struct of all values if all are Some, None if any is None.
|
|
@@ -618,7 +596,10 @@ export var ap = function (optionFn) {
|
|
|
618
596
|
* const config = sequenceS({
|
|
619
597
|
* apiKey: Option.fromNullable(process.env.API_KEY),
|
|
620
598
|
* port: Option.tryCatch(() => parseInt(process.env.PORT!)),
|
|
621
|
-
* debug:
|
|
599
|
+
* debug: pipe(
|
|
600
|
+
* Option.fromNullable(process.env.DEBUG),
|
|
601
|
+
* Option.map(v => v === 'true'),
|
|
602
|
+
* )
|
|
622
603
|
* });
|
|
623
604
|
*/
|
|
624
605
|
export var sequenceS = function (struct) {
|
|
@@ -634,4 +615,231 @@ export var sequenceS = function (struct) {
|
|
|
634
615
|
}
|
|
635
616
|
return some(result);
|
|
636
617
|
};
|
|
618
|
+
/**
|
|
619
|
+
* Executes an Option for its side effects, discarding the result.
|
|
620
|
+
* @description Runs an Option-returning function but preserves the original value.
|
|
621
|
+
* Useful for logging or other side effects where the result isn't needed.
|
|
622
|
+
*
|
|
623
|
+
* @template A - The type of the value
|
|
624
|
+
* @param {function(A): Option<unknown>} f - Function that returns an Option (result discarded)
|
|
625
|
+
* @returns {function(Option<A>): Option<A>} A function that executes side effects
|
|
626
|
+
*
|
|
627
|
+
* @category Combinators
|
|
628
|
+
* @example
|
|
629
|
+
* const log = (msg: string): Option<void> => {
|
|
630
|
+
* console.log(msg);
|
|
631
|
+
* return Option.some(undefined);
|
|
632
|
+
* };
|
|
633
|
+
*
|
|
634
|
+
* const result = Option.chainFirst((n: number) => log(`Got: ${n}`))(
|
|
635
|
+
* Option.some(42)
|
|
636
|
+
* ); // logs "Got: 42", returns Some(42)
|
|
637
|
+
*
|
|
638
|
+
* @since 2025-09-18
|
|
639
|
+
*/
|
|
640
|
+
export var chainFirst = function (f) {
|
|
641
|
+
return function (option) {
|
|
642
|
+
if (isNone(option)) {
|
|
643
|
+
return option;
|
|
644
|
+
}
|
|
645
|
+
var sideEffect = f(option.value);
|
|
646
|
+
if (isNone(sideEffect)) {
|
|
647
|
+
return none();
|
|
648
|
+
}
|
|
649
|
+
return option;
|
|
650
|
+
};
|
|
651
|
+
};
|
|
652
|
+
/**
|
|
653
|
+
* Combines Options in a tuple into an Option of a tuple.
|
|
654
|
+
* @description Takes multiple Options and returns an Option containing a tuple
|
|
655
|
+
* of their values. Returns None if any Option is None.
|
|
656
|
+
*
|
|
657
|
+
* @template T - Tuple type of Options
|
|
658
|
+
* @param {...T} options - Options to combine
|
|
659
|
+
* @returns {Option<{ [K in keyof T]: T[K] extends Option<infer U> ? U : never }>} Option of tuple
|
|
660
|
+
*
|
|
661
|
+
* @category Combinators
|
|
662
|
+
* @example
|
|
663
|
+
* const option1 = Option.some(1);
|
|
664
|
+
* const option2 = Option.some('hello');
|
|
665
|
+
* const option3 = Option.some(true);
|
|
666
|
+
*
|
|
667
|
+
* const combined = Option.sequenceT(option1, option2, option3);
|
|
668
|
+
* // => Some([1, 'hello', true])
|
|
669
|
+
*
|
|
670
|
+
* @since 2025-09-18
|
|
671
|
+
*/
|
|
672
|
+
export var sequenceT = function () {
|
|
673
|
+
var options = [];
|
|
674
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
675
|
+
options[_i] = arguments[_i];
|
|
676
|
+
}
|
|
677
|
+
var values = [];
|
|
678
|
+
for (var _a = 0, options_2 = options; _a < options_2.length; _a++) {
|
|
679
|
+
var option = options_2[_a];
|
|
680
|
+
if (isNone(option)) {
|
|
681
|
+
return none();
|
|
682
|
+
}
|
|
683
|
+
values.push(option.value);
|
|
684
|
+
}
|
|
685
|
+
return some(values);
|
|
686
|
+
};
|
|
687
|
+
/**
|
|
688
|
+
* Maps a function returning an Option over an array and sequences the results.
|
|
689
|
+
* @description Applies an Option-returning function to each element of an array
|
|
690
|
+
* and collects all results. If any operation returns None, returns None.
|
|
691
|
+
*
|
|
692
|
+
* @template T - The input type
|
|
693
|
+
* @template U - The output type
|
|
694
|
+
* @param {function(T): Option<U>} f - Function that returns an Option
|
|
695
|
+
* @returns {function(T[]): Option<U[]>} A function that traverses arrays with Options
|
|
696
|
+
*
|
|
697
|
+
* @category Combinators
|
|
698
|
+
* @example
|
|
699
|
+
* const parseNumber = (s: string): Option<number> => {
|
|
700
|
+
* const n = Number(s);
|
|
701
|
+
* return isNaN(n) ? Option.none() : Option.some(n);
|
|
702
|
+
* };
|
|
703
|
+
*
|
|
704
|
+
* const parseAll = Option.traverse(parseNumber);
|
|
705
|
+
* parseAll(['1', '2', '3']); // => Some([1, 2, 3])
|
|
706
|
+
* parseAll(['1', 'x', '3']); // => None
|
|
707
|
+
*
|
|
708
|
+
* @since 2025-09-18
|
|
709
|
+
*/
|
|
710
|
+
export var traverse = function (f) {
|
|
711
|
+
return function (ts) {
|
|
712
|
+
var results = [];
|
|
713
|
+
for (var _i = 0, ts_1 = ts; _i < ts_1.length; _i++) {
|
|
714
|
+
var t = ts_1[_i];
|
|
715
|
+
var option = f(t);
|
|
716
|
+
if (isNone(option)) {
|
|
717
|
+
return none();
|
|
718
|
+
}
|
|
719
|
+
results.push(option.value);
|
|
720
|
+
}
|
|
721
|
+
return some(results);
|
|
722
|
+
};
|
|
723
|
+
};
|
|
724
|
+
/**
|
|
725
|
+
* Applies an Option of a function to an Option of a value.
|
|
726
|
+
* @description Enables applying functions wrapped in Options to values wrapped
|
|
727
|
+
* in Options. If either Option is None, returns None. This is the
|
|
728
|
+
* applicative apply operation for Option types.
|
|
729
|
+
*
|
|
730
|
+
* @template A - The input type
|
|
731
|
+
* @template B - The output type
|
|
732
|
+
* @param {Option<A>} optionValue - Option containing a value
|
|
733
|
+
* @returns {function(Option<function(A): B>): Option<B>} A function that applies Option functions
|
|
734
|
+
*
|
|
735
|
+
* @category Combinators
|
|
736
|
+
* @example
|
|
737
|
+
* const add = (a: number) => (b: number) => a + b;
|
|
738
|
+
* const optionAdd = Option.some(add);
|
|
739
|
+
* const option5 = Option.some(5);
|
|
740
|
+
* const option3 = Option.some(3);
|
|
741
|
+
*
|
|
742
|
+
* const sum = Option.ap(option3)(
|
|
743
|
+
* Option.ap(option5)(
|
|
744
|
+
* Option.map(add)(Option.some(10))
|
|
745
|
+
* )
|
|
746
|
+
* ); // => Some(18)
|
|
747
|
+
*
|
|
748
|
+
* @since 2025-09-18
|
|
749
|
+
*/
|
|
750
|
+
export var ap = function (optionValue) {
|
|
751
|
+
return function (optionFn) {
|
|
752
|
+
if (isNone(optionFn) || isNone(optionValue)) {
|
|
753
|
+
return none();
|
|
754
|
+
}
|
|
755
|
+
return some(optionFn.value(optionValue.value));
|
|
756
|
+
};
|
|
757
|
+
};
|
|
758
|
+
/**
|
|
759
|
+
* Do notation helper for Option types.
|
|
760
|
+
* @description Provides a way to write sequential Option operations in an
|
|
761
|
+
* imperative style, similar to async/await but for Option types.
|
|
762
|
+
*
|
|
763
|
+
* @returns {object} Do notation builder
|
|
764
|
+
*
|
|
765
|
+
* @category Do Notation
|
|
766
|
+
* @example
|
|
767
|
+
* const result = Option.Do()
|
|
768
|
+
* .bind('x', Option.some(5))
|
|
769
|
+
* .bind('y', Option.some(3))
|
|
770
|
+
* .map(({ x, y }) => x + y);
|
|
771
|
+
* // => Some(8)
|
|
772
|
+
*
|
|
773
|
+
* @example
|
|
774
|
+
* const withNone = Option.Do()
|
|
775
|
+
* .bind('x', Option.some(5))
|
|
776
|
+
* .bind('y', Option.none())
|
|
777
|
+
* .map(({ x, y }) => x + y);
|
|
778
|
+
* // => None
|
|
779
|
+
*
|
|
780
|
+
* @example
|
|
781
|
+
* // With dependent bindings
|
|
782
|
+
* const calculation = Option.Do()
|
|
783
|
+
* .bind('a', Option.some(10))
|
|
784
|
+
* .bind('b', ({ a }) => a > 5 ? Option.some(a * 2) : Option.none())
|
|
785
|
+
* .bind('c', ({ b }) => Option.some(b + 1))
|
|
786
|
+
* .map(({ a, b, c }) => ({ original: a, doubled: b, final: c }));
|
|
787
|
+
* // => Some({ original: 10, doubled: 20, final: 21 })
|
|
788
|
+
*
|
|
789
|
+
* @since 2025-09-18
|
|
790
|
+
*/
|
|
791
|
+
export var Do = function () {
|
|
792
|
+
var createBuilder = function (context) { return ({
|
|
793
|
+
bind: function (key, option) {
|
|
794
|
+
var _a;
|
|
795
|
+
if (isNone(context)) {
|
|
796
|
+
return createBuilder(context);
|
|
797
|
+
}
|
|
798
|
+
var actualOption = typeof option === "function" ? option(context.value) : option;
|
|
799
|
+
if (isNone(actualOption)) {
|
|
800
|
+
return createBuilder(none());
|
|
801
|
+
}
|
|
802
|
+
return createBuilder(some(__assign(__assign({}, context.value), (_a = {}, _a[key] = actualOption.value, _a))));
|
|
803
|
+
},
|
|
804
|
+
map: function (f) {
|
|
805
|
+
return isSome(context) ? some(f(context.value)) : none();
|
|
806
|
+
},
|
|
807
|
+
flatMap: function (f) {
|
|
808
|
+
return isSome(context) ? f(context.value) : none();
|
|
809
|
+
},
|
|
810
|
+
value: function () { return context; },
|
|
811
|
+
}); };
|
|
812
|
+
return createBuilder(some({}));
|
|
813
|
+
};
|
|
814
|
+
/**
|
|
815
|
+
* Namespace containing all Option utilities.
|
|
816
|
+
*
|
|
817
|
+
* @category Namespace
|
|
818
|
+
*/
|
|
819
|
+
export var Option = {
|
|
820
|
+
some: some,
|
|
821
|
+
none: none,
|
|
822
|
+
fromNullable: fromNullable,
|
|
823
|
+
fromPredicate: fromPredicate,
|
|
824
|
+
tryCatch: tryCatch,
|
|
825
|
+
isSome: isSome,
|
|
826
|
+
isNone: isNone,
|
|
827
|
+
map: map,
|
|
828
|
+
flatMap: flatMap,
|
|
829
|
+
chain: chain,
|
|
830
|
+
getOrElse: getOrElse,
|
|
831
|
+
orElse: orElse,
|
|
832
|
+
filter: filter,
|
|
833
|
+
tapOption: tapOption,
|
|
834
|
+
match: match,
|
|
835
|
+
toNullable: toNullable,
|
|
836
|
+
toUndefined: toUndefined,
|
|
837
|
+
ap: ap,
|
|
838
|
+
chainFirst: chainFirst,
|
|
839
|
+
sequenceT: sequenceT,
|
|
840
|
+
traverse: traverse,
|
|
841
|
+
sequenceOption: sequenceOption,
|
|
842
|
+
sequenceS: sequenceS,
|
|
843
|
+
Do: Do,
|
|
844
|
+
};
|
|
637
845
|
//# sourceMappingURL=option.mjs.map
|
package/dist/option.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"option.mjs","sourceRoot":"","sources":["../src/option.mts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"option.mjs","sourceRoot":"","sources":["../src/option.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option.test.d.ts","sourceRoot":"","sources":["../src/option.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|