import { ActionCreator } from './create-action-creator';
import { AnyAction } from './create-action';
import { Handler } from './types';
export declare const othersHandlerKey: unique symbol;
declare type CustomHandlerMap<TPrevState, TAction extends AnyAction, TNextState extends TPrevState = TPrevState> = {
    [type in TAction['type']]: Handler<TPrevState, TAction, TNextState>;
};
declare type OthersHandlerMap<TPrevState, TAction extends AnyAction, TNextState extends TPrevState = TPrevState> = {
    [othersHandlerKey]: Handler<TPrevState, TAction, TNextState>;
};
export declare type HandlerMap<TPrevState, TAction extends AnyAction, TNextState extends TPrevState = TPrevState> = CustomHandlerMap<TPrevState, TAction, TNextState> | OthersHandlerMap<TPrevState, TAction, TNextState>;
export declare type MergedHandlerMap<TPrevState, TAction extends AnyAction, TNextState extends TPrevState = TPrevState> = CustomHandlerMap<TPrevState, TAction, TNextState> & OthersHandlerMap<TPrevState, TAction, TNextState>;
export declare type InferActionFromHandlerMap<THandlerMap extends HandlerMap<any, any>> = THandlerMap extends CustomHandlerMap<any, infer T> ? T : never;
export declare type InferNextStateFromHandlerMap<THandlerMap extends HandlerMap<any, any>> = THandlerMap extends CustomHandlerMap<any, any, infer T> ? T : never;
declare type InferActionFromCreator<TActionCreator> = TActionCreator extends (...args: any[]) => infer T ? T : never;
declare type CreateOthersHandler<TPrevState> = <TActionCreator extends ActionCreator<any>, TNextState extends TPrevState, TAction extends AnyAction = InferActionFromCreator<TActionCreator>>(handler: Handler<TPrevState, TAction, TNextState>) => OthersHandlerMap<TPrevState, TAction, TNextState>;
declare type CreateCustomHandlerMap<TPrevState> = <TActionCreator extends ActionCreator<any>, TNextState extends TPrevState, TAction extends AnyAction = InferActionFromCreator<TActionCreator>>(actionCreators: TActionCreator | TActionCreator[], handler: Handler<TPrevState, TAction, TNextState>) => CustomHandlerMap<TPrevState, TAction, TNextState>;
export declare type CreateHandlerMap<TPrevState> = CreateCustomHandlerMap<TPrevState> & {
    others: CreateOthersHandler<TPrevState>;
};
/**
 * Handler map factory
 * @description create an action(s) to reducer map
 * @example
 * createHandlerMap(increment, (state: number) => state + 1)
 * @example
 * createHandlerMap([increment, increase], (state: number) => state + 1)
 * @example
 * createHandlerMap.others((state: number) => state + 1)
 */
export declare function createHandlerMap<TActionCreator extends ActionCreator<any>, TPrevState, TNextState extends TPrevState, TAction extends AnyAction = InferActionFromCreator<TActionCreator>>(actionCreators: TActionCreator | TActionCreator[], handler: Handler<TPrevState, TAction, TNextState>): CustomHandlerMap<TPrevState, TAction, TNextState>;
export declare namespace createHandlerMap {
    var others: typeof createOthersHandlerMap;
}
declare function createOthersHandlerMap<TActionCreator extends ActionCreator<any>, TPrevState, TNextState extends TPrevState, TAction extends AnyAction = InferActionFromCreator<TActionCreator>>(handler: Handler<TPrevState, TAction, TNextState>): OthersHandlerMap<TPrevState, TAction, TNextState>;
export {};
