import { ActionCall } from "../action";
import { OnSnapshotDisposer, OnSnapshotListener } from "../snapshot/onSnapshot";
import type { SnapshotOutOf } from "../snapshot/SnapshotOf";
export declare const reduxActionType = "applyAction";
/**
 * A redux action for mobx-keystone.
 */
export interface ReduxAction {
    readonly type: typeof reduxActionType;
    readonly payload: ActionCall;
}
/**
 * Transforms an action call into a redux action.
 *
 * @param actionCall Action call.
 * @returns A redux action.
 */
export declare function actionCallToReduxAction(actionCall: ActionCall): ReduxAction;
/**
 * A redux store for mobx-keystone.
 */
export interface ReduxStore<T> {
    getState(): SnapshotOutOf<T>;
    dispatch(action: ReduxAction): ReduxAction;
    subscribe(listener: OnSnapshotListener<T>): OnSnapshotDisposer;
}
/**
 * A redux runner for mobx-keystone.
 */
export interface ReduxRunner<T> {
    (next: ReduxStore<T>["dispatch"]): (action: ReduxAction) => ReduxAction;
}
/**
 * A redux middleware for mobx-keystone.
 */
export interface ReduxMiddleware<T> {
    (store: ReduxStore<T>): ReduxRunner<T>;
}
/**
 * Generates a redux compatible store out of a mobx-keystone object.
 *
 * @template T Object type.
 * @param target Root object.
 * @param middlewares Optional list of redux middlewares.
 * @returns A redux compatible store.
 */
export declare function asReduxStore<T extends object>(target: T, ...middlewares: ReduxMiddleware<T>[]): ReduxStore<T>;
