import { Either } from 'fp-ts/Either';
import { Env } from './Env';
import { Resume } from './Resume';
/**
 * @since 0.9.2
 * @category Model
 */
export declare type Fail<Key extends PropertyKey, E> = {
    readonly [_ in Key]: (e: E) => Resume<never>;
};
/**
 * @since 0.9.2
 * @category Constructor
 */
export declare const throwError: <Key extends PropertyKey>(key: Key) => <E>(err: E) => Env<Fail<Key, E>, never>;
/**
 * @since 0.9.2
 * @category Combinator
 */
export declare const catchErrorW: <Key extends PropertyKey>(key: Key) => <E, R1, A>(onError: (err: E) => Env<R1, A>) => <R2, B>(env: Env<Fail<Key, E>, B> | Env<R2 & Fail<Key, E>, B>) => Env<R1 & R2, A | B>;
/**
 * @since 0.9.2
 * @category Combinator
 */
export declare const catchError: <Key extends PropertyKey>(key: Key) => <E, R1, A>(onError: (err: E) => Env<R1, A>) => {
    <R2>(env: Env<Fail<Key, E>, A> | Env<R2 & Fail<Key, E>, A>): Env<R1 & R2, A>;
    (env: Env<Fail<Key, E>, A>): Env<R1, A>;
};
/**
 * @since 0.9.2
 * @category Combinator
 */
export declare const attempt: <Key extends PropertyKey>(key: Key) => <R, E, B>(env: Env<Fail<Key, E>, B> | Env<R & Fail<Key, E>, B>) => Env<R, Either<E, B>>;
/**
 * Creates a Provider for an Error which will throw an Exception.
 * Reserve this only for *critical* application errors
 * @since 0.13.4
 * @category Environment
 */
export declare const criticalExpection: <K extends PropertyKey>(key: K) => <E>(f: (error: E) => string) => Fail<K, E>;
/**
 * @since 0.9.2
 * @category Model
 */
export interface Failure<K extends PropertyKey, E> {
    readonly throw: (err: E) => Env<Fail<K, E>, never>;
    readonly catchW: <R1, A>(onError: (err: E) => Env<R1, A>) => <R2, B>(env: Env<Fail<K, E>, B> | Env<R2 & Fail<K, E>, B>) => Env<R1 & R2, A | B>;
    readonly catch: <R1, A>(onError: (err: E) => Env<R1, A>) => {
        <R2>(env: Env<Fail<K, E>, A> | Env<R2 & Fail<K, E>, A>): Env<R1 & R2, A>;
        (env: Env<Fail<K, E>, A>): Env<R1, A>;
    };
    readonly attempt: <R, B>(env: Env<Fail<K, E>, B> | Env<R & Fail<K, E>, B>) => Env<R, Either<E, B>>;
    readonly criticalExpection: (f: (error: E) => string) => Fail<K, E>;
}
/**
 * @since 0.9.2
 * @category Constructor
 */
export declare const named: <E>() => <K extends PropertyKey>(name: K) => Failure<K, E>;
/**
 * @since 0.13.4
 * @category Type-level
 */
export declare type ErrorOf<A> = [A] extends [Failure<infer _, infer E>] ? E : [A] extends [Fail<infer _, infer E>] ? E : never;
/**
 * @since 0.13.4
 * @category Type-level
 */
export declare type KeyOf<A> = [A] extends [Failure<infer K, infer _>] ? K : [A] extends [Fail<infer K, infer _>] ? K : never;
/**
 * @since 0.13.4
 * @category Type-level
 */
export declare type EnvOf<A> = [A] extends [Failure<infer K, infer E>] ? Fail<K, E> : [A] extends [Fail<infer K, infer E>] ? Fail<K, E> : never;
//# sourceMappingURL=Fail.d.ts.map