import { Resume } from '@typed/env';
import { Maybe } from '@typed/maybe';
import { Capabilities, Effects } from '../Effect';
export declare type FailEnv<K extends PropertyKey, Err> = {
    readonly [Key in K]: Fail<Err>;
};
export declare type Fail<Err> = <A>(error: Err) => Resume<Failure<Err, A>>;
export declare const Fail: Fail<any>;
export declare type FailureTypes<E extends Effects<any, any>> = keyof FailuresOf<E>;
export declare type FailuresOf<E extends Effects<any, any>> = Pick<Capabilities<E>, FailureKeys<Capabilities<E>>>;
export declare type ErrorOf<E extends Effects<any, any>, K extends FailureTypes<E>> = FailuresOf<E>[K] extends Fail<infer R> ? R : never;
declare type FailureKeys<A> = {
    [K in keyof A]: A[K] extends Fail<any> ? K : never;
}[keyof A];
export declare class Failure<Err, A> {
    readonly error: Err;
    readonly value: Maybe<A>;
    static of: <Err_1, A_1>(error: Err_1, value?: Maybe<A_1>) => Failure<Err_1, A_1>;
    constructor(error: Err, value: Maybe<A>);
    readonly unpack: <B>(left: (err: Err) => B, right: (value: A) => B) => B;
}
export {};
//# sourceMappingURL=Failure.d.ts.map