const SOME = Symbol('some'); export interface ISome { [SOME]: true; value: T; } export type Maybe = ISome | null | undefined; export const Some = (value: T): ISome => ({ [SOME]: true, value, }); export const None = () => null; export function or(maybe: Maybe, def: () => T) { return maybe ? maybe.value : def(); } export function isSome(maybe: Maybe): maybe is ISome { return !!maybe; } export function get(some: ISome) { return some.value; }