import { Refinement } from 'fp-ts/Refinement';
import { Literal, Schemable1, WithRefine1, WithUnion1 } from './Schemable';
/**
 * @category Model
 * @since 0.9.5
 */
export interface Guard<I, A extends I> {
    is: (i: I) => i is A;
}
/**
 * @since 2.2.2
 */
export declare type TypeOf<G> = G extends Guard<any, infer A> ? A : never;
/**
 * @since 0.9.5
 */
export declare type InputOf<G> = G extends Guard<infer I, any> ? I : never;
/**
 * @category constructors
 * @since 0.9.5
 */
export declare const literal: <A extends readonly [Literal, ...Literal[]]>(...values: A) => Guard<unknown, A[number]>;
/**
 * @category Decoder
 * @since 0.9.5
 */
export declare const string: Guard<unknown, string>;
/**
 * Note: `NaN` is excluded.
 *
 * @category Decoder
 * @since 0.9.5
 */
export declare const number: Guard<unknown, number>;
/**
 * @category Decoder
 * @since 0.9.5
 */
export declare const boolean: Guard<unknown, boolean>;
/**
 * @category Decoder
 * @since 0.9.5
 */
export declare const date: Guard<unknown, Date>;
/**
 * @category Decoder
 * @since 0.9.5
 */
export declare const unknownArray: Guard<unknown, Array<unknown>>;
/**
 * @category Decoder
 * @since 0.9.5
 */
export declare const unknownRecord: Guard<unknown, Record<string, unknown>>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const refine: <I, A extends I, B extends A>(refinement: Refinement<A, B>) => (from: Guard<I, A>) => Guard<I, B>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const nullable: <I, A extends I>(or: Guard<I, A>) => Guard<I | null, A | null>;
/**
 * @category Combinator
 * @since 2.2.15
 */
export declare const struct: <A>(properties: { [K in keyof A]: Guard<unknown, A[K]>; }) => Guard<unknown, { [K_1 in keyof A]: A[K_1]; }>;
/**
 * Use `struct` instead.
 *
 * @category Combinator
 * @since 0.9.5
 * @deprecated
 */
export declare const type: <A>(properties: { [K in keyof A]: Guard<unknown, A[K]>; }) => Guard<unknown, { [K_1 in keyof A]: A[K_1]; }>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const partial: <A>(properties: { [K in keyof A]: Guard<unknown, A[K]>; }) => Guard<unknown, Partial<{ [K_1 in keyof A]: A[K_1]; }>>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const array: <A>(item: Guard<unknown, A>) => Guard<unknown, A[]>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const record: <A>(codomain: Guard<unknown, A>) => Guard<unknown, Record<string, A>>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const tuple: <A extends readonly unknown[]>(...components: { [K in keyof A]: Guard<unknown, A[K]>; }) => Guard<unknown, A>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const intersect: <B>(right: Guard<unknown, B>) => <A>(left: Guard<unknown, A>) => Guard<unknown, A & B>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const union: <A>(second: Guard<unknown, A>) => <B>(first: Guard<unknown, B>) => Guard<unknown, A | B>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const sum: <T extends string>(tag: T) => <A>(members: { [K in keyof A]: Guard<unknown, A[K] & Record<T, K>>; }) => Guard<unknown, A[keyof A]>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const lazy: <A>(f: () => Guard<unknown, A>) => Guard<unknown, A>;
/**
 * @category Combinator
 * @since 2.2.15
 */
export declare const readonly: <I, A extends I>(guard: Guard<I, A>) => Guard<I, Readonly<A>>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const alt: <I, A extends I>(that: () => Guard<I, A>) => (me: Guard<I, A>) => Guard<I, A>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const zero: <I, A extends I>() => Guard<I, A>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const compose: <I, A extends I, B extends A>(to: Guard<A, B>) => (from: Guard<I, A>) => Guard<I, B>;
/**
 * @category Combinator
 * @since 0.9.5
 */
export declare const id: <A>() => Guard<A, A>;
/**
 * @category instances
 * @since 0.9.5
 */
export declare const URI = "@typed/fp/Guard";
/**
 * @category instances
 * @since 0.9.5
 */
export declare type URI = typeof URI;
declare module 'fp-ts/HKT' {
    interface URItoKind<A> {
        readonly [URI]: Guard<unknown, A>;
    }
}
/**
 * @category instances
 * @since 0.9.5
 */
export declare const Schemable: Schemable1<URI>;
/**
 * @category instances
 * @since 0.9.5
 */
export declare const WithUnion: WithUnion1<URI>;
/**
 * @category instances
 * @since 0.9.5
 */
export declare const WithRefine: WithRefine1<URI>;
//# sourceMappingURL=Guard.d.ts.map