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