import { Get, Predicate } from './Get';
import { TypeGuard } from './TypeGuard';
import { Func } from './Func';
declare class CaseBuilder<V> {
    readonly v: V;
    constructor(v: V);
    case<T>(pred: Predicate<V>, out: Get<T, V>): Case<T, V>;
    type<T, U = unknown>(guard: TypeGuard<U>, out: Func<T, U>): Case<T, V>;
    equals<T>(value: V, out: Get<T, V>): Case<T, V>;
    is: {
        defined: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        empty: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        valid: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        not: {
            defined: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
            empty: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
            valid: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        };
    };
    if: {
        defined: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        empty: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        valid: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        not: {
            defined: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
            empty: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
            valid: <T>(prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        };
    };
}
declare class Case<T, V = unknown> {
    protected value: V;
    protected outcome?: T | undefined;
    constructor(value: V, outcome?: T | undefined);
    case(pred: Predicate<V>, out: Get<T, V>): Case<T, V>;
    type<U>(guard: TypeGuard<U>, out: Func<T, U>): Case<T, V>;
    equals(value: V, out: Get<T, V>): Case<T, V>;
    is: {
        defined: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        empty: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        valid: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        not: {
            defined: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
            empty: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
            valid: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        };
    };
    if: {
        defined: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        empty: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        valid: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        not: {
            defined: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
            empty: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
            valid: (prop: Func<unknown, V>, out: Get<T, V>) => Case<T, V>;
        };
    };
    else(alt: Get<T, V>): T;
}
export declare const choose: <V>(value: V) => CaseBuilder<V>;
export {};
