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 {};