declare const errorSym: unique symbol; export type Result = A | Failure; export interface Failure { readonly [errorSym]: string; } export interface Fail { (error: string): Failure; in(prefix: string): Fail; locate(x: Result): Result; } export interface failure extends Fail { } export declare function failure(error: string): Failure; export declare namespace failure { var _a: (prefix: string) => Fail; export var locate: (x: Result) => Result; export { _a as in }; } export declare function isFailure(x: Result): x is Failure; export declare function isSuccess(x: Result): x is A; export declare function unpack(x: Result): A; export declare function unpackOr(x: Result, def: B): B extends A ? A : A | B; export declare function errorMessage(x: Failure): string; export declare function errorFrom(x: Failure): Error; export declare function assertSuccess(x: Result): asserts x is A; export declare function assertSuccess(x: Failure): never; export declare function tryCatch(block: () => A): Result; export declare function tryCatch(failFn: Fail, block: () => A): Result; export declare function using(value: Result, block: (x: A) => Result): Result; /** * Like 'using', but can take any number of functions */ export declare function chain(value: Result, b0: (x: A) => Result): Result; export declare function chain(value: Result, b0: (x: A) => Result, b1: (x: B) => Result): Result; export declare function chain(value: Result, b0: (x: A) => Result, b1: (x: B) => Result, b2: (x: C) => Result): Result; export declare function chain(value: Result, b0: (x: A) => Result, b1: (x: B) => Result, b2: (x: C) => Result, b3: (x: D) => Result): Result; export declare function chain(value: Result, b0: (x: A) => Result, b1: (x: B) => Result, b2: (x: C) => Result, b3: (x: D) => Result, b4: (x: E) => Result): Result; export declare function chain(value: Result, b0: (x: A) => Result, b1: (x: B) => Result, b2: (x: C) => Result, b3: (x: D) => Result, b4: (x: E) => Result, b5: (x: F) => Result): Result; /** * Make a function that will prepend a prefix to error messages * * This is one way to be specific about the location where errors originate, by prefixing * errors as the call stack unwinds. * * A different method is to pass in a modified failure function using `failure.in(...)`, * to build the error message as the call stack deepens. */ export declare function locateFailure(prefix: string): (x: Result) => Result; export type Failures = Array; export declare function liftResult(xs: Record>): Result>; export declare function liftResult(xs: Array>): Result>; /** * Lift a value that can be 'undefined' to a result, or a function that can return undefined. */ export declare function liftUndefined(v: A | undefined): Result>; export declare function liftUndefined A>(v: F): (x: Parameters) => Result>; export {};