export type Option = | { value: T; isSome: true; } | { value: undefined; isSome: false; }; export function Some(value: T): Option { return { value, isSome: true }; } export function None(): Option { return { value: undefined, isSome: false }; } export function map(option: Option, fn: (value: T) => U): Option { return option.isSome ? Some(fn(option.value)) : None(); } export function flatMap( option: Option, fn: (value: T) => Option, ): Option { return option.isSome ? fn(option.value) : None(); } export function getOrElse(option: Option, defaultValue: T): T { return option.isSome ? option.value : defaultValue; } export function fold( option: Option, onNone: () => U, onSome: (value: T) => U, ): U { return option.isSome ? onSome(option.value) : onNone(); }