import { IAData, IReduxActionConstructor, ISingleReducer } from "./action";
import { IReducerInfo } from "./combine-reducers";
import { IState } from "./preload-state";
export interface IVirtualStore<ValueInterface> {
    getReducers?(): IReducerInfo<ValueInterface>[];
    name: string;
    defaultValue?: ValueInterface;
}
export interface IVirtualStoreConstructor<ValueInterface> {
    new (): IVirtualStore<ValueInterface>;
    name: string;
}
/** only use in this file */
export interface IVirtualStoreClass<ValueInterface> {
    new (): VirtualStore<ValueInterface>;
    name: string;
}
export declare function reduce<VI, IData extends IAData>(Constructor: IVirtualStoreClass<VI>, Action: IReduxActionConstructor<IData, VI>, ...reducer: ISingleReducer<VI, IData>[]): void;
export declare function reduceAny<VI, IData extends IAData>(Constructor: IVirtualStoreClass<VI>, Action: IReduxActionConstructor<IData, VI>, ...reducer: ISingleReducer<VI, IData>[]): void;
export declare function extractorOf<VI>(vs: IVirtualStoreClass<VI>): (state: IState) => VI;
export declare function subExtractorOf<VI, KT = keyof VI>(vs: IVirtualStoreClass<VI>, key: KT): (state: IState) => any;
export declare abstract class VirtualStore<ValueInterface> implements IVirtualStore<ValueInterface> {
    private reducers;
    readonly name: string;
    readonly defaultValue: ValueInterface;
    static readonly ANY: string;
    constructor();
    protected reduce<IData extends IAData>(Action: IReduxActionConstructor<IData, ValueInterface>, ...reducer: ISingleReducer<ValueInterface, IData>[]): void;
    protected reduceAny<IData extends IAData>(Action: IReduxActionConstructor<IData, any>, ...reducer: ISingleReducer<any, IData>[]): void;
    getReducers(): IReducerInfo<ValueInterface>[];
}
