import { Action } from './action';
export interface Reducer<T> {
    (state: T | undefined, action: Action<any, any>): T;
}
export declare type Reducible<T extends Reducible<any>> = T & {
    reduce(action: Action<any, any>): Reducible<T>;
};
export declare type Reducibles<T extends object = any> = {
    [P in keyof T]: Reducible<T[P]>;
};
export interface ParametricReducibleFactory<D, T extends Reducibles> {
    data: D;
    type: T & Reducible<T>;
    buildReducer: (data: D) => Reducer<T>;
    (data: D): T & Reducible<T>;
}
export interface ReducibleFactory<T extends Reducibles> {
    type: Reducible<T>;
    buildReducer: () => Reducer<T>;
    (): Reducible<T>;
}
export declare function buildReducibleFactory<T extends Reducibles = object>(builder: () => T): ReducibleFactory<T>;
export declare function buildReducibleFactory<D = any, T extends Reducibles = object>(builder: (data: D) => T): ParametricReducibleFactory<D, T>;
