Skip to content

O (Option)

type None = { readonly _tag: 0 }
type Some<A> = { readonly _tag: 1; readonly value: A }
type Option<A> = None | Some<A>

Numeric _tag for fast branching. none is a singleton.

some<A>(value: A): Option<A>
none: None
fromNullable<A>(value: A | null | undefined): Option<NonNullable<A>>
fromPredicate<A>(pred: (a: A) => boolean): (a: A) => Option<A>
map<A, B>(f: (a: A) => B): (o: Option<A>) => Option<B>
flatMap<A, B>(f: (a: A) => Option<B>): (o: Option<A>) => Option<B>
filter<A>(pred: (a: A) => boolean): (o: Option<A>) => Option<A>
tap<A>(f: (a: A) => void): (o: Option<A>) => Option<A>
getOrElse<B>(onNone: () => B): <A>(o: Option<A>) => A | B
getWithDefault<B>(value: B): <A>(o: Option<A>) => A | B
match<B, A, C = B>(onNone: () => B, onSome: (a: A) => C): (o: Option<A>) => B | C
toNullable<A>(o: Option<A>): A | null
toUndefined<A>(o: Option<A>): A | undefined
toResult<E>(defaultError: E): <A>(o: Option<A>) => Result<A, E>
isSome<A>(o: Option<A>): o is Some<A>
isNone<A>(o: Option<A>): o is None
import { pipe, O } from '@stopcock/fp'
// safe env variable with validation
const port = pipe(
O.fromNullable(process.env.PORT),
O.map(s => parseInt(s, 10)),
O.filter(n => n > 0 && n < 65536),
O.getOrElse(() => 3000),
)
// chain nullable lookups
pipe(
O.fromNullable(user.address),
O.flatMap(a => O.fromNullable(a.zip)),
O.match(() => 'no zip', zip => zip),
)
// convert to Result for error context
pipe(
O.fromNullable(headers.authorization),
O.toResult('missing auth header'),
)