import { Spec, SpecType, Model, SpecPool } from 'pretur.spec';
import { Dispatch } from 'reducible-node';
import { Query, MutateRequest, Requester } from 'pretur.sync';
import { State } from './clay';
import { Querier } from './Querier';
import { Record } from './Record';
import { Set } from './Set';
import { Fields } from './fields';
export interface MutationGetter<T extends SpecType = SpecType> {
    (clay: Set<T> | Record<T>, scope: string, model: T['name']): MutateRequest<T>[];
}
export declare function selectAndRefresh<T extends SpecType>(pool: SpecPool, spec: Spec<T>, requester: Requester, dispatch: Dispatch, set: Set<T>, querier: Querier<T>, extra?: Query<T>): Promise<{
    data: Model<T>[];
    count: number;
}>;
export interface Helpers<T extends SpecType> {
    fields(values?: Partial<Model<T>>): Fields<T>;
    record(state?: State, values?: Partial<Model<T>>): Record<T>;
    record(values?: Partial<Model<T>>): Record<T>;
    set(items?: Partial<Model<T>>[]): Set<T>;
    mutations(clay: Set<T> | Record<T>): MutateRequest<T>[];
    querier(query?: Query<T>): Querier<T>;
    load(query?: Query<T>): Promise<{
        data: Model<T>[];
        count: number;
    }>;
    load(dispatch: Dispatch, set: Set<T>, query?: Query<T>): Promise<void>;
    load(dispatch: Dispatch, record: Record<T>, query?: Query<T>): Promise<boolean>;
    select(dispatch: Dispatch, set: Set<T>, querier: Querier<T>, extra?: Query<T>): Promise<{
        data: Model<T>[];
        count: number;
    }>;
}
export interface HelperFactory {
    <T extends SpecType>(spec: Spec<T>): Helpers<T>;
}
export declare function buildHelpersFactory(pool: SpecPool, requester: Requester, mutationGetter: MutationGetter<any>): HelperFactory;
