import { DefaultOrFunc } from "./fn"; import { None, Maybe, Voidable } from "./maybe"; /** Means success */ export interface Ok { res: T; } /** Means failure */ export interface Err { err: E; } /** Union of success or failure * ```ts * type Result = Ok | Err * ``` */ export declare type Result = Ok | Err; /** Make a `Ok` */ export declare function ok(res: T): Ok; /** Make a `Err` */ export declare function err(err: E): Err; /** Check value is `OK` */ export declare function isOk(v?: any): v is Ok; /** Check value is `Err` */ export declare function isErr(v?: any): v is Err; /** Check value is `Result` */ export declare function isResult(v?: any): v is Result; /** Get `T` in `Ok` */ export declare function getOk(v: Ok): T; /** Get nothing */ export declare function getOk(v: Err): undefined; /** Get `T` in `Result` */ export declare function getOk(v: Result): Voidable; /** Get nothing */ export declare function getOk(v?: undefined): undefined; /** Get nothing */ export declare function getOk(v?: null): null; /** Get nothing */ export declare function getOk(v?: None): None; /** Get `T` in `Result` */ export declare function getOk(v?: Maybe>): Voidable; /** Get `E` in `Err` */ export declare function getErr(v: Err): E; /** Get nothing */ export declare function getErr(v: Ok): undefined; /** Get `E` in `Result` */ export declare function getErr(v: Result): Voidable; /** Get nothing */ export declare function getErr(v?: undefined): undefined; /** Get nothing */ export declare function getErr(v?: null): null; /** Get nothing */ export declare function getErr(v?: None): None; /** Get `E` in `Result` */ export declare function getErr(v?: Maybe>): Voidable; export declare function mapOk(v: Result, f: (val: T) => U): Result; export declare function mapErr(v: Result, f: (val: E) => U): Result; export declare namespace Result { export function and(v: Result, o: DefaultOrFunc>): Result; export function or(v: Result, o: DefaultOrFunc>): Result; /** Transpose Result to Maybe */ export function transpose(v: Result, E>): Voidable>; type NestedOk = Ok | Ok>; type NestedResult = Result | Ok>; type FlattenResult = N extends NestedOk ? FlattenResult : N extends Err ? N : Ok; /** Flatten result * * ## Example * ```ts * let a: Result<1, 2> = flatten, 2>, 2>>(ok(ok(ok(1)))) * let b: Ok<1> = flatten>>>(ok(ok(ok(1)))) * let c: Err<2> = flatten>>>(ok(ok(err(2)))) * ``` */ export function flatten>(v: N): FlattenResult; export {}; }