import Traversable from "../../specifications/Traversable"; import Filterable from "../../specifications/Filterable"; import Monad from "../../specifications/Monad"; import { Applicative, ApplicativeTypeRep } from "../../specifications/Applicative"; import { FNA1 } from "../../specifications/Function"; export default abstract class Maybe implements Monad, Filterable, Traversable { protected constructor(); abstract map(fn: (a: A) => B): Maybe; abstract ap(other: Maybe): A extends FNA1 ? Maybe : Maybe; abstract chain(fn: (value: A) => Maybe): Maybe; static of(value: A): Maybe; abstract filter(fn: (value: A) => Boolean): Maybe; abstract reduce(reducer: (accumulator: B, value: A) => B, initial: B): B; abstract traverse(TypeRep: ApplicativeTypeRep>, fn: (a: A) => Applicative): Applicative>; abstract join(): Maybe; abstract get(): A | never; abstract getOrElse(other: A): A; abstract getOrElseRun(fn: () => A): A; abstract inspect(): string; static just(value: A): Just; static nothing(_?: A): Nothing; static fromNullable(value?: A): Maybe; get isJust(): Boolean; get isNothing(): Boolean; } declare class Nothing extends Maybe { constructor(); map(fn: (a: A) => B): Nothing; ap(other: Maybe): A extends FNA1 ? Nothing : Nothing; chain(fn: (value: A) => Maybe): Nothing; filter(fn: (value: A) => Boolean): Nothing; reduce(reducer: (accumulator: B, value: A) => B, initial: B): B; traverse(TypeRep: ApplicativeTypeRep>, fn: (a: A) => Applicative): Applicative>; join(): Nothing; get(): never; getOrElse(other: A): A; getOrElseRun(fn: () => A): A; get isNothing(): Boolean; inspect(): string; } declare class Just extends Maybe { protected readonly value: A; constructor(value: A); map(fn: (a: A) => B): Maybe; ap(other: Maybe): A extends FNA1 ? Maybe : Maybe; chain(fn: (value: A) => Maybe): Maybe; filter(fn: (value: A) => Boolean): Maybe; reduce(reducer: (accumulator: B, value: A) => B, initial: B): B; traverse(TypeRep: ApplicativeTypeRep>, fn: (a: A) => Applicative): Applicative>; join(): Maybe; get(): A; getOrElse(other: A): A; getOrElseRun(fn: () => A): A; get isJust(): Boolean; inspect(): string; } export {};