import { EventBus } from "./EventBus";
import { BusEvent, DispatchFn, SubscribeFn, SubscriptionDef, UnsubscribeFn } from "./types";
export declare type InitFn<T> = (a: any) => T;
export declare type ReducerFn<S, E> = (s: S, e: E) => S;
export declare type UseReducerFn<T, E> = (reducer: ReducerFn<T, E>, initState: any, init: InitFn<T>) => [T, any];
export declare function _defaultSubscriber<E extends BusEvent>(dispatch: DispatchFn<E>, bus: EventBus): UnsubscribeFn;
export declare const reducerSubscriber: <E extends BusEvent<any>>(...definition: SubscriptionDef<E>[]) => SubscribeFn<E>;
export declare function useBusReducer<E extends BusEvent = BusEvent, T = any>(reducer: ReducerFn<T, E>, initState: any, init?: InitFn<T>): any;
export declare namespace useBusReducer {
    var configure: <E extends BusEvent<any> = BusEvent<any>>(options: UseBusReducerOptions<E, any>) => (reducer: ReducerFn<any, E>, initState: any, init?: InitFn<any>) => any;
}
declare type UseBusReducerOptions<E extends BusEvent, T = any> = {
    subscriber?: SubscribeFn<E>;
    useReducer?: (reducer: ReducerFn<T, E>, initState: T, init: InitFn<T>) => any;
};
export {};
