Skip to content

Maybe

Maybe: object

Defined in: Core/Maybe.ts:25

ap: <A>(arg) => <B>(data) => Maybe<B>

Applies a function wrapped in a Maybe to a value wrapped in a Maybe.

A

Maybe<A>

<B>(data) => Maybe<B>

const add = (a: number) => (b: number) => a + b;
pipe(
  Maybe.make.some(add),
  Maybe.ap(Maybe.make.some(5)),
  Maybe.ap(Maybe.make.some(3))
); // Some(8)

bind: <K, A, B>(key, f) => (data) => Maybe<A & { [P in string]: B }>

Evaluates a new Maybe using the current accumulator and attaches the output to a new key.

K extends string

A

B

K

(a) => Maybe<B>

(data) => Maybe<A & { [P in string]: B }>

pipe(
  Maybe.make.some({ a: 1 }),
  Maybe.bind("b", ({ a }) => Maybe.make.some(a + 1))
); // Some({ a: 1, b: 2 })

bindTo: <K>(key) => <A>(data) => Maybe<{ [P in string]: A }>

Converts a Maybe value into an object containing a single property. Initiates the pipeline accumulator record.

K extends string

K

<A>(data) => Maybe<{ [P in string]: A }>

pipe(Maybe.make.some(42), Maybe.bindTo("value")); // Some({ value: 42 })

chain: <A, B>(f) => (data) => Maybe<B>

Chains Maybe computations. If the first is Some, passes the value to f. If the first is None, propagates None.

A

B

(a) => Maybe<B>

(data) => Maybe<B>

const parseNumber = (s: string): Maybe<number> => {
  const n = parseInt(s, 10);
  return isNaN(n) ? Maybe.make.none() : Maybe.make.some(n);
};

pipe(Maybe.make.some("42"), Maybe.chain(parseNumber)); // Some(42)
pipe(Maybe.make.some("abc"), Maybe.chain(parseNumber)); // None

filter: <A>(predicate) => (data) => Maybe<A>

Filters a Maybe based on a predicate. Returns None if the predicate returns false or if the Maybe is already None.

A

(a) => boolean

(data) => Maybe<A>

pipe(Maybe.make.some(5), Maybe.filter(n => n > 3)); // Some(5)
pipe(Maybe.make.some(2), Maybe.filter(n => n > 3)); // None

fold: <A, B>(onNone, onSome) => (data) => B

Extracts the value from a Maybe by providing handlers for both cases.

A

B

() => B

(a) => B

(data) => B

pipe(
  Maybe.make.some(5),
  Maybe.fold(
    () => "No value",
    n => `Value: ${n}`
  )
); // "Value: 5"

from: object

nullable: <A>(value) => Maybe<A>

Creates a Maybe from a nullable value. Returns None if the value is null or undefined, Some otherwise.

A

A | null | undefined

Maybe<A>

Maybe.from.nullable(null); // None
Maybe.from.nullable(42); // Some(42)

Predicate: <A>(pred) => (a) => Maybe<A>

Creates a Maybe from a predicate applied to a value. Returns Some if the predicate passes, None otherwise.

A

(a) => boolean

(a) => Maybe<A>

Maybe.from.Predicate((n: number) => n >= 18)(21); // Some(21)
Maybe.from.Predicate((n: number) => n >= 18)(15); // None

pipe("hello", Maybe.from.Predicate((s: string) => s.length > 0)); // Some("hello")
pipe("", Maybe.from.Predicate((s: string) => s.length > 0));      // None

Result: <E, A>(data) => Maybe<A>

Creates a Maybe from a Result. Ok becomes Some, Err becomes None (the error is discarded).

E

A

Result<E, A>

Maybe<A>

Maybe.from.Result(Result.make.ok(42)); // Some(42)
Maybe.from.Result(Result.make.err("oops")); // None

getOrElse: <B>(defaultValue) => <A>(data) => B | A

Returns the value inside a Maybe, or a default value if None. The default is a thunk () => B — evaluated only when the Maybe is None. The default can be a different type, widening the result to A | B.

B

() => B

<A>(data) => B | A

pipe(Maybe.make.some(5), Maybe.getOrElse(() => 0)); // 5
pipe(Maybe.make.none(), Maybe.getOrElse(() => 0)); // 0
pipe(Maybe.make.none<string>(), Maybe.getOrElse(() => null)); // null — typed as string | null

is: object

none: <A>(data) => data is None = isNone

Type guard that checks if a Maybe is None.

A

Maybe<A>

data is None

const value = Maybe.make.none();
if (Maybe.is.none(value)) {
  console.log("No value present");
}

some: <A>(data) => data is Some<A> = isSome

Type guard that checks if a Maybe is Some.

A

Maybe<A>

data is Some<A>

const value = Maybe.make.some(42);
if (Maybe.is.some(value)) {
  console.log(value.value); // 42
}

make: object

none: () => None = makeNone

Creates a None (empty Maybe).

None

Maybe.make.none(); // None

some: <A>(value) => Some<A> = makeSome

Creates a Some containing the given value.

A

A

Some<A>

Maybe.make.some(42); // Some(42)

map: <A, B>(f) => (data) => Maybe<B>

Transforms the value inside a Maybe if it exists.

A

B

(a) => B

(data) => Maybe<B>

pipe(Maybe.make.some(5), Maybe.map(n => n * 2)); // Some(10)
pipe(Maybe.make.none(), Maybe.map(n => n * 2)); // None

match: <A, B>(cases) => (data) => B

Pattern matches on a Maybe, returning the result of the matching case.

A

B

() => B

(a) => B

(data) => B

pipe(
  optionUser,
  Maybe.match({
    some: user => `Hello, ${user.name}`,
    none: () => "Hello, stranger"
  })
);

recover: <B>(fallback) => <A>(data) => Maybe<B | A>

Recovers from a None by providing a fallback Maybe. The fallback can produce a different type, widening the result to Maybe<A | B>.

B

() => Maybe<B>

<A>(data) => Maybe<B | A>

pipe(Maybe.make.none(), Maybe.recover(() => Maybe.make.some(42))); // Some(42)
pipe(Maybe.make.some(10), Maybe.recover(() => Maybe.make.some(42))); // Some(10)

struct: <R>(fields) => Maybe<R>

Combines a record of Maybes into a single Maybe of a record. Evaluates fields in key order and short-circuits on the first None.

R extends Record<string, any>

{ [K in string | number | symbol]: Maybe<R[K]> }

Maybe<R>

Maybe.struct({
  name: Maybe.make.some("Alice"),
  age: Maybe.make.some(30)
}); // Some({ name: "Alice", age: 30 })

tap: <A>(f) => (data) => Maybe<A>

Executes a side effect on the value without changing the Maybe. Useful for logging or debugging.

A

(a) => void

(data) => Maybe<A>

pipe(
  Maybe.make.some(5),
  Maybe.tap(n => console.log("Value:", n)),
  Maybe.map(n => n * 2)
);

to: object

nullable: <A>(data) => A | null

Extracts the value from a Maybe, returning null if None.

A

Maybe<A>

A | null

Maybe.to.nullable(Maybe.make.some(42)); // 42
Maybe.to.nullable(Maybe.make.none());   // null

Result: <E>(onNone) => <A>(data) => Result<E, A>

Converts a Maybe to a Result. Some becomes Ok, None becomes Err with the provided error.

E

() => E

<A>(data) => Result<E, A>

pipe(
  Maybe.make.some(42),
  Maybe.to.Result(() => "Value was missing")
); // Ok(42)

pipe(
  Maybe.make.none(),
  Maybe.to.Result(() => "Value was missing")
); // Err("Value was missing")

undefined: <A>(data) => A | undefined

Extracts the value from a Maybe, returning undefined if None.

A

Maybe<A>

A | undefined

Maybe.to.undefined(Maybe.make.some(42)); // 42
Maybe.to.undefined(Maybe.make.none());   // undefined

transposeResult: <E, A>(data) => Result<E, Maybe<A>>

Swaps the outer Maybe and inner Result context. Some(Ok(a)) becomes Ok(Some(a)), Some(Err(e)) becomes Err(e), and None becomes Ok(None).

E

A

Maybe<Result<E, A>>

Result<E, Maybe<A>>

Maybe.transposeResult(Maybe.make.some(Result.make.ok(42)));  // Ok(Some(42))
Maybe.transposeResult(Maybe.make.some(Result.make.err("e"))); // Err("e")
Maybe.transposeResult(Maybe.make.none());                     // Ok(None)