/* adapted from https://github.com/gcanti/fp-ts */ /** * @tsplus type Maybe */ export type Maybe = None | Some export interface MaybeF extends HKT { readonly type: Maybe } export declare namespace Maybe { export type HKT = MaybeF } /** * @tsplus type Maybe.Ops */ export interface MaybeOps { $: MaybeAspects } export const Maybe: MaybeOps = { $: {} } /** * @tsplus type Maybe.Aspects */ export interface MaybeAspects {} /** * Definitions * * @tsplus type Maybe.None */ export interface None { readonly _tag: "None" } /** * @tsplus type Maybe.Some */ export interface Some { readonly _tag: "Some" readonly value: A } /** * @tsplus unify Maybe * @tsplus unify Maybe.Some * @tsplus unify Maybe.None */ export function unifyMaybe>( self: X ): Maybe ? A : never> { return self } export type ArrayOfMaybies[]> = { [k in keyof Ts]: Ts[k] extends Maybe ? A : never }[number] /** * Constructs `None`. * * @tsplus static Maybe.Ops none */ export const none: Maybe = { _tag: "None" } /** * Constructs `None`. * * @tsplus static Maybe.Ops empty */ export function empty(): Maybe { return none } /** * Constructs `Some`. * * @tsplus static Maybe.Ops some */ export function some(a: A): Maybe { return { _tag: "Some", value: a } } /** * Returns `true` if the maybe is `None`, `false` otherwise. * * @tsplus fluent Maybe isNone */ export function isNone(fa: Maybe): fa is None { return fa._tag === "None" } /** * Returns `true` if the maybe is an instance of `Some`, `false` otherwise. * * @tsplus fluent Maybe isSome */ export function isSome(fa: Maybe): fa is Some { return fa._tag === "Some" } /** * @tsplus static Maybe.Ops isMaybe */ export function isMaybe(u: unknown): u is Maybe { return ( typeof u === "object" && u != null && "_tag" in u && (u["_tag"] === "Some" || u["_tag"] === "None") ) } /** * @tsplus operator Maybe == */ export function equals(a: Maybe, b: Maybe) { return Equals.equals(a, b) }