@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.d.mts
CHANGED
|
@@ -5,6 +5,18 @@
|
|
|
5
5
|
* Forces explicit handling of edge cases and eliminates null pointer exceptions.
|
|
6
6
|
* Inspired by functional programming languages like Haskell and Rust.
|
|
7
7
|
*
|
|
8
|
+
* ### For Dummies
|
|
9
|
+
* - An `Option` is either "Some value" or "None"—no surprises, no `null` pitfalls.
|
|
10
|
+
* - You poke at it with helper functions instead of checking for `null` everywhere.
|
|
11
|
+
* - When you finally need a real value, you decide how to handle the empty case explicitly.
|
|
12
|
+
*
|
|
13
|
+
* ### Decision Tree
|
|
14
|
+
* - Have a definite value? Wrap it with `Option.some(value)`.
|
|
15
|
+
* - Unsure if a value exists? Use `Option.fromNullable(maybeValue)`.
|
|
16
|
+
* - Transforming without changing emptiness? Use `Option.map(fn)`.
|
|
17
|
+
* - Need the next step to also be optional? Use `Option.flatMap(fnReturningOption)`.
|
|
18
|
+
* - Want a default? Call `Option.getOrElse(() => fallback)(option)` at the edge.
|
|
19
|
+
*
|
|
8
20
|
* @example
|
|
9
21
|
* ```typescript
|
|
10
22
|
* import { Option, some, none, fromNullable, map, getOrElse } from './option.mts';
|
|
@@ -55,7 +67,7 @@ export type Option<T> = Some<T> | None;
|
|
|
55
67
|
* @since 2025-07-03
|
|
56
68
|
*/
|
|
57
69
|
export interface Some<T> {
|
|
58
|
-
readonly _tag:
|
|
70
|
+
readonly _tag: "Some";
|
|
59
71
|
readonly value: T;
|
|
60
72
|
}
|
|
61
73
|
/**
|
|
@@ -68,7 +80,7 @@ export interface Some<T> {
|
|
|
68
80
|
* @since 2025-07-03
|
|
69
81
|
*/
|
|
70
82
|
export interface None {
|
|
71
|
-
readonly _tag:
|
|
83
|
+
readonly _tag: "None";
|
|
72
84
|
}
|
|
73
85
|
/**
|
|
74
86
|
* Creates a Some variant containing the provided value.
|
|
@@ -266,8 +278,10 @@ export declare const map: <A, B>(fn: (value: A) => B) => (option: Option<A>) =>
|
|
|
266
278
|
* @example
|
|
267
279
|
* // Chaining optional operations
|
|
268
280
|
* const getManager = (employee: Employee) =>
|
|
269
|
-
*
|
|
270
|
-
* .
|
|
281
|
+
* pipe(
|
|
282
|
+
* Option.fromNullable(employee.managerId),
|
|
283
|
+
* Option.flatMap(id => findEmployee(id)),
|
|
284
|
+
* );
|
|
271
285
|
*
|
|
272
286
|
* @example
|
|
273
287
|
* // Validation chain
|
|
@@ -473,16 +487,16 @@ export declare const tryCatch: <T>(fn: () => T) => Option<T>;
|
|
|
473
487
|
* @example
|
|
474
488
|
* const logValue = pipe(
|
|
475
489
|
* Option.some(42),
|
|
476
|
-
* Option.
|
|
490
|
+
* Option.tapOption(value => console.log('Found value:', value))
|
|
477
491
|
* ); // logs "Found value: 42" and returns Some(42)
|
|
478
492
|
*
|
|
479
493
|
* @example
|
|
480
494
|
* // Debug logging in a chain
|
|
481
495
|
* const result = pipe(
|
|
482
496
|
* getUserInput(),
|
|
483
|
-
* Option.
|
|
497
|
+
* Option.tapOption(input => console.log('Raw input:', input)),
|
|
484
498
|
* Option.map(normalize),
|
|
485
|
-
* Option.
|
|
499
|
+
* Option.tapOption(normalized => console.log('Normalized:', normalized)),
|
|
486
500
|
* Option.filter(isValid)
|
|
487
501
|
* );
|
|
488
502
|
*
|
|
@@ -490,37 +504,10 @@ export declare const tryCatch: <T>(fn: () => T) => Option<T>;
|
|
|
490
504
|
* // Side effects like analytics
|
|
491
505
|
* const trackEvent = pipe(
|
|
492
506
|
* findUser(id),
|
|
493
|
-
* Option.
|
|
507
|
+
* Option.tapOption(user => analytics.track('user.found', { id: user.id }))
|
|
494
508
|
* );
|
|
495
509
|
*/
|
|
496
|
-
export declare const
|
|
497
|
-
/**
|
|
498
|
-
* Namespace containing all Option utilities.
|
|
499
|
-
*
|
|
500
|
-
* @category Namespace
|
|
501
|
-
*/
|
|
502
|
-
export declare const Option: {
|
|
503
|
-
readonly some: <T>(value: T) => Option<T>;
|
|
504
|
-
readonly none: () => Option<never>;
|
|
505
|
-
readonly fromNullable: <T>(value: T | null | undefined) => Option<T>;
|
|
506
|
-
readonly fromPredicate: <T>(predicate: (value: T) => boolean) => (value: T) => Option<T>;
|
|
507
|
-
readonly tryCatch: <T>(fn: () => T) => Option<T>;
|
|
508
|
-
readonly isSome: <T>(option: Option<T>) => option is Some<T>;
|
|
509
|
-
readonly isNone: <T>(option: Option<T>) => option is None;
|
|
510
|
-
readonly map: <A, B>(fn: (value: A) => B) => (option: Option<A>) => Option<B>;
|
|
511
|
-
readonly flatMap: <A, B>(fn: (value: A) => Option<B>) => (option: Option<A>) => Option<B>;
|
|
512
|
-
readonly chain: <A, B>(fn: (value: A) => Option<B>) => (option: Option<A>) => Option<B>;
|
|
513
|
-
readonly getOrElse: <T>(defaultValue: () => T) => (option: Option<T>) => T;
|
|
514
|
-
readonly orElse: <T>(alternative: () => Option<T>) => (option: Option<T>) => Option<T>;
|
|
515
|
-
readonly filter: typeof filter;
|
|
516
|
-
readonly tap: <T>(fn: (value: T) => void) => (option: Option<T>) => Option<T>;
|
|
517
|
-
readonly match: <T, A, B>(patterns: {
|
|
518
|
-
some: (value: T) => A;
|
|
519
|
-
none: () => B;
|
|
520
|
-
}) => (option: Option<T>) => A | B;
|
|
521
|
-
readonly toNullable: <T>(option: Option<T>) => T | null;
|
|
522
|
-
readonly toUndefined: <T>(option: Option<T>) => T | undefined;
|
|
523
|
-
};
|
|
510
|
+
export declare const tapOption: <T>(fn: (value: T) => void) => (option: Option<T>) => Option<T>;
|
|
524
511
|
/**
|
|
525
512
|
* Combines two Options using a binary function.
|
|
526
513
|
* Returns None if either Option is None.
|
|
@@ -551,7 +538,7 @@ export declare const lift2: <A, B, C>(fn: (a: A, b: B) => C) => (optionA: Option
|
|
|
551
538
|
*
|
|
552
539
|
* @category Combinations
|
|
553
540
|
* @example
|
|
554
|
-
* const results =
|
|
541
|
+
* const results = sequenceOption([
|
|
555
542
|
* Option.some(1),
|
|
556
543
|
* Option.some(2),
|
|
557
544
|
* Option.some(3)
|
|
@@ -560,36 +547,19 @@ export declare const lift2: <A, B, C>(fn: (a: A, b: B) => C) => (optionA: Option
|
|
|
560
547
|
*
|
|
561
548
|
* @example
|
|
562
549
|
* // Parse multiple values
|
|
563
|
-
* const numbers =
|
|
550
|
+
* const numbers = sequenceOption(
|
|
564
551
|
* inputs.map(input => parseNumber(input))
|
|
565
552
|
* );
|
|
566
553
|
*
|
|
567
554
|
* @example
|
|
568
555
|
* // Validate all fields
|
|
569
|
-
* const validatedFields =
|
|
556
|
+
* const validatedFields = sequenceOption([
|
|
570
557
|
* validateField('name', data.name),
|
|
571
558
|
* validateField('email', data.email),
|
|
572
559
|
* validateField('age', data.age)
|
|
573
560
|
* ]);
|
|
574
561
|
*/
|
|
575
|
-
export declare const
|
|
576
|
-
/**
|
|
577
|
-
* Applies a function wrapped in an Option to a value wrapped in an Option.
|
|
578
|
-
*
|
|
579
|
-
* @category Apply
|
|
580
|
-
* @example
|
|
581
|
-
* const addOne = (n: number) => n + 1;
|
|
582
|
-
* const result = ap(Option.some(addOne))(Option.some(5));
|
|
583
|
-
* // => Some(6)
|
|
584
|
-
*
|
|
585
|
-
* @example
|
|
586
|
-
* // Partial application with options
|
|
587
|
-
* const add = (a: number) => (b: number) => a + b;
|
|
588
|
-
* const maybeAdd5 = Option.map(add)(Option.some(5));
|
|
589
|
-
* const result = ap(maybeAdd5)(Option.some(3));
|
|
590
|
-
* // => Some(8)
|
|
591
|
-
*/
|
|
592
|
-
export declare const ap: <A, B>(optionFn: Option<(a: A) => B>) => (optionA: Option<A>) => Option<B>;
|
|
562
|
+
export declare const sequenceOption: <T>(options: Option<T>[]) => Option<T[]>;
|
|
593
563
|
/**
|
|
594
564
|
* Sequences a struct of Options into an Option of a struct.
|
|
595
565
|
* Returns Some with the struct of all values if all are Some, None if any is None.
|
|
@@ -615,8 +585,182 @@ export declare const ap: <A, B>(optionFn: Option<(a: A) => B>) => (optionA: Opti
|
|
|
615
585
|
* const config = sequenceS({
|
|
616
586
|
* apiKey: Option.fromNullable(process.env.API_KEY),
|
|
617
587
|
* port: Option.tryCatch(() => parseInt(process.env.PORT!)),
|
|
618
|
-
* debug:
|
|
588
|
+
* debug: pipe(
|
|
589
|
+
* Option.fromNullable(process.env.DEBUG),
|
|
590
|
+
* Option.map(v => v === 'true'),
|
|
591
|
+
* )
|
|
619
592
|
* });
|
|
620
593
|
*/
|
|
621
594
|
export declare const sequenceS: <T extends Record<string, Option<unknown>>>(struct: T) => Option<{ [K in keyof T]: T[K] extends Option<infer U> ? U : never; }>;
|
|
595
|
+
/**
|
|
596
|
+
* Executes an Option for its side effects, discarding the result.
|
|
597
|
+
* @description Runs an Option-returning function but preserves the original value.
|
|
598
|
+
* Useful for logging or other side effects where the result isn't needed.
|
|
599
|
+
*
|
|
600
|
+
* @template A - The type of the value
|
|
601
|
+
* @param {function(A): Option<unknown>} f - Function that returns an Option (result discarded)
|
|
602
|
+
* @returns {function(Option<A>): Option<A>} A function that executes side effects
|
|
603
|
+
*
|
|
604
|
+
* @category Combinators
|
|
605
|
+
* @example
|
|
606
|
+
* const log = (msg: string): Option<void> => {
|
|
607
|
+
* console.log(msg);
|
|
608
|
+
* return Option.some(undefined);
|
|
609
|
+
* };
|
|
610
|
+
*
|
|
611
|
+
* const result = Option.chainFirst((n: number) => log(`Got: ${n}`))(
|
|
612
|
+
* Option.some(42)
|
|
613
|
+
* ); // logs "Got: 42", returns Some(42)
|
|
614
|
+
*
|
|
615
|
+
* @since 2025-09-18
|
|
616
|
+
*/
|
|
617
|
+
export declare const chainFirst: <A>(f: (a: A) => Option<unknown>) => (option: Option<A>) => Option<A>;
|
|
618
|
+
/**
|
|
619
|
+
* Combines Options in a tuple into an Option of a tuple.
|
|
620
|
+
* @description Takes multiple Options and returns an Option containing a tuple
|
|
621
|
+
* of their values. Returns None if any Option is None.
|
|
622
|
+
*
|
|
623
|
+
* @template T - Tuple type of Options
|
|
624
|
+
* @param {...T} options - Options to combine
|
|
625
|
+
* @returns {Option<{ [K in keyof T]: T[K] extends Option<infer U> ? U : never }>} Option of tuple
|
|
626
|
+
*
|
|
627
|
+
* @category Combinators
|
|
628
|
+
* @example
|
|
629
|
+
* const option1 = Option.some(1);
|
|
630
|
+
* const option2 = Option.some('hello');
|
|
631
|
+
* const option3 = Option.some(true);
|
|
632
|
+
*
|
|
633
|
+
* const combined = Option.sequenceT(option1, option2, option3);
|
|
634
|
+
* // => Some([1, 'hello', true])
|
|
635
|
+
*
|
|
636
|
+
* @since 2025-09-18
|
|
637
|
+
*/
|
|
638
|
+
export declare const sequenceT: <T extends readonly Option<unknown>[]>(...options: T) => Option<{ [K in keyof T]: T[K] extends Option<infer U> ? U : never; }>;
|
|
639
|
+
/**
|
|
640
|
+
* Maps a function returning an Option over an array and sequences the results.
|
|
641
|
+
* @description Applies an Option-returning function to each element of an array
|
|
642
|
+
* and collects all results. If any operation returns None, returns None.
|
|
643
|
+
*
|
|
644
|
+
* @template T - The input type
|
|
645
|
+
* @template U - The output type
|
|
646
|
+
* @param {function(T): Option<U>} f - Function that returns an Option
|
|
647
|
+
* @returns {function(T[]): Option<U[]>} A function that traverses arrays with Options
|
|
648
|
+
*
|
|
649
|
+
* @category Combinators
|
|
650
|
+
* @example
|
|
651
|
+
* const parseNumber = (s: string): Option<number> => {
|
|
652
|
+
* const n = Number(s);
|
|
653
|
+
* return isNaN(n) ? Option.none() : Option.some(n);
|
|
654
|
+
* };
|
|
655
|
+
*
|
|
656
|
+
* const parseAll = Option.traverse(parseNumber);
|
|
657
|
+
* parseAll(['1', '2', '3']); // => Some([1, 2, 3])
|
|
658
|
+
* parseAll(['1', 'x', '3']); // => None
|
|
659
|
+
*
|
|
660
|
+
* @since 2025-09-18
|
|
661
|
+
*/
|
|
662
|
+
export declare const traverse: <T, U>(f: (t: T) => Option<U>) => (ts: T[]) => Option<U[]>;
|
|
663
|
+
/**
|
|
664
|
+
* Applies an Option of a function to an Option of a value.
|
|
665
|
+
* @description Enables applying functions wrapped in Options to values wrapped
|
|
666
|
+
* in Options. If either Option is None, returns None. This is the
|
|
667
|
+
* applicative apply operation for Option types.
|
|
668
|
+
*
|
|
669
|
+
* @template A - The input type
|
|
670
|
+
* @template B - The output type
|
|
671
|
+
* @param {Option<A>} optionValue - Option containing a value
|
|
672
|
+
* @returns {function(Option<function(A): B>): Option<B>} A function that applies Option functions
|
|
673
|
+
*
|
|
674
|
+
* @category Combinators
|
|
675
|
+
* @example
|
|
676
|
+
* const add = (a: number) => (b: number) => a + b;
|
|
677
|
+
* const optionAdd = Option.some(add);
|
|
678
|
+
* const option5 = Option.some(5);
|
|
679
|
+
* const option3 = Option.some(3);
|
|
680
|
+
*
|
|
681
|
+
* const sum = Option.ap(option3)(
|
|
682
|
+
* Option.ap(option5)(
|
|
683
|
+
* Option.map(add)(Option.some(10))
|
|
684
|
+
* )
|
|
685
|
+
* ); // => Some(18)
|
|
686
|
+
*
|
|
687
|
+
* @since 2025-09-18
|
|
688
|
+
*/
|
|
689
|
+
export declare const ap: <A, B>(optionValue: Option<A>) => (optionFn: Option<(a: A) => B>) => Option<B>;
|
|
690
|
+
type Context = Record<string, unknown>;
|
|
691
|
+
interface Builder {
|
|
692
|
+
bind: <K extends string, T>(key: K, option: Option<T> | ((ctx: Context) => Option<T>)) => Builder;
|
|
693
|
+
map: <T>(f: (ctx: Context) => T) => Option<T>;
|
|
694
|
+
flatMap: <T>(f: (ctx: Context) => Option<T>) => Option<T>;
|
|
695
|
+
value: () => Option<Context>;
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Do notation helper for Option types.
|
|
699
|
+
* @description Provides a way to write sequential Option operations in an
|
|
700
|
+
* imperative style, similar to async/await but for Option types.
|
|
701
|
+
*
|
|
702
|
+
* @returns {object} Do notation builder
|
|
703
|
+
*
|
|
704
|
+
* @category Do Notation
|
|
705
|
+
* @example
|
|
706
|
+
* const result = Option.Do()
|
|
707
|
+
* .bind('x', Option.some(5))
|
|
708
|
+
* .bind('y', Option.some(3))
|
|
709
|
+
* .map(({ x, y }) => x + y);
|
|
710
|
+
* // => Some(8)
|
|
711
|
+
*
|
|
712
|
+
* @example
|
|
713
|
+
* const withNone = Option.Do()
|
|
714
|
+
* .bind('x', Option.some(5))
|
|
715
|
+
* .bind('y', Option.none())
|
|
716
|
+
* .map(({ x, y }) => x + y);
|
|
717
|
+
* // => None
|
|
718
|
+
*
|
|
719
|
+
* @example
|
|
720
|
+
* // With dependent bindings
|
|
721
|
+
* const calculation = Option.Do()
|
|
722
|
+
* .bind('a', Option.some(10))
|
|
723
|
+
* .bind('b', ({ a }) => a > 5 ? Option.some(a * 2) : Option.none())
|
|
724
|
+
* .bind('c', ({ b }) => Option.some(b + 1))
|
|
725
|
+
* .map(({ a, b, c }) => ({ original: a, doubled: b, final: c }));
|
|
726
|
+
* // => Some({ original: 10, doubled: 20, final: 21 })
|
|
727
|
+
*
|
|
728
|
+
* @since 2025-09-18
|
|
729
|
+
*/
|
|
730
|
+
export declare const Do: () => Builder;
|
|
731
|
+
/**
|
|
732
|
+
* Namespace containing all Option utilities.
|
|
733
|
+
*
|
|
734
|
+
* @category Namespace
|
|
735
|
+
*/
|
|
736
|
+
export declare const Option: {
|
|
737
|
+
readonly some: <T>(value: T) => Option<T>;
|
|
738
|
+
readonly none: () => Option<never>;
|
|
739
|
+
readonly fromNullable: <T>(value: T | null | undefined) => Option<T>;
|
|
740
|
+
readonly fromPredicate: <T>(predicate: (value: T) => boolean) => (value: T) => Option<T>;
|
|
741
|
+
readonly tryCatch: <T>(fn: () => T) => Option<T>;
|
|
742
|
+
readonly isSome: <T>(option: Option<T>) => option is Some<T>;
|
|
743
|
+
readonly isNone: <T>(option: Option<T>) => option is None;
|
|
744
|
+
readonly map: <A, B>(fn: (value: A) => B) => (option: Option<A>) => Option<B>;
|
|
745
|
+
readonly flatMap: <A, B>(fn: (value: A) => Option<B>) => (option: Option<A>) => Option<B>;
|
|
746
|
+
readonly chain: <A, B>(fn: (value: A) => Option<B>) => (option: Option<A>) => Option<B>;
|
|
747
|
+
readonly getOrElse: <T>(defaultValue: () => T) => (option: Option<T>) => T;
|
|
748
|
+
readonly orElse: <T>(alternative: () => Option<T>) => (option: Option<T>) => Option<T>;
|
|
749
|
+
readonly filter: typeof filter;
|
|
750
|
+
readonly tapOption: <T>(fn: (value: T) => void) => (option: Option<T>) => Option<T>;
|
|
751
|
+
readonly match: <T, A, B>(patterns: {
|
|
752
|
+
some: (value: T) => A;
|
|
753
|
+
none: () => B;
|
|
754
|
+
}) => (option: Option<T>) => A | B;
|
|
755
|
+
readonly toNullable: <T>(option: Option<T>) => T | null;
|
|
756
|
+
readonly toUndefined: <T>(option: Option<T>) => T | undefined;
|
|
757
|
+
readonly ap: <A, B>(optionValue: Option<A>) => (optionFn: Option<(a: A) => B>) => Option<B>;
|
|
758
|
+
readonly chainFirst: <A>(f: (a: A) => Option<unknown>) => (option: Option<A>) => Option<A>;
|
|
759
|
+
readonly sequenceT: <T extends readonly Option<unknown>[]>(...options: T) => Option<{ [K in keyof T]: T[K] extends Option<infer U> ? U : never; }>;
|
|
760
|
+
readonly traverse: <T, U>(f: (t: T) => Option<U>) => (ts: T[]) => Option<U[]>;
|
|
761
|
+
readonly sequenceOption: <T>(options: Option<T>[]) => Option<T[]>;
|
|
762
|
+
readonly sequenceS: <T extends Record<string, Option<unknown>>>(struct: T) => Option<{ [K in keyof T]: T[K] extends Option<infer U> ? U : never; }>;
|
|
763
|
+
readonly Do: () => Builder;
|
|
764
|
+
};
|
|
765
|
+
export {};
|
|
622
766
|
//# sourceMappingURL=option.d.mts.map
|
package/dist/option.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"option.d.mts","sourceRoot":"","sources":["../src/option.mts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"option.d.mts","sourceRoot":"","sources":["../src/option.mts"],"names":[],"mappings":"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"}
|