import type Rule from '../rules/rule';
import type { Infer, Schema } from '@decs/typeschema';
export type Signal<TContext, TSchema extends Schema> = {
    _schema: TSchema;
    evaluate: (context: TContext) => Promise<Infer<TSchema>>;
    not: Omit<Signal<TContext, TSchema>, 'evaluate' | 'not'>;
    equals(value: Infer<TSchema>): Rule<TContext>;
    in(values: Array<Infer<TSchema>>): Rule<TContext>;
} & (Infer<TSchema> extends Array<infer TElement> ? {
    every(rule: Rule<TElement>): Rule<TContext>;
    some(rule: Rule<TElement>): Rule<TContext>;
    contains(value: TElement): Rule<TContext>;
    containsEvery(values: Array<TElement>): Rule<TContext>;
    containsSome(values: Array<TElement>): Rule<TContext>;
} : Infer<TSchema> extends boolean ? {
    isTrue(): Rule<TContext>;
    isFalse(): Rule<TContext>;
} : Infer<TSchema> extends number ? {
    lessThan(value: Infer<TSchema>): Rule<TContext>;
    lessThanOrEquals(value: Infer<TSchema>): Rule<TContext>;
    greaterThan(value: Infer<TSchema>): Rule<TContext>;
    greaterThanOrEquals(value: Infer<TSchema>): Rule<TContext>;
} : Infer<TSchema> extends string ? {
    includes(value: Infer<TSchema>): Rule<TContext>;
    endsWith(value: Infer<TSchema>): Rule<TContext>;
    startsWith(value: Infer<TSchema>): Rule<TContext>;
    matches(value: RegExp): Rule<TContext>;
} : Record<string, never>);
export type SignalFactory<TSchema extends Schema> = {
    _schema: TSchema;
    value: <TContext>(fn: (context: TContext) => Infer<TSchema> | Promise<Infer<TSchema>>) => Signal<TContext, TSchema>;
};
export declare function type<TSchema extends Schema>(schema: TSchema): SignalFactory<TSchema>;
