import { assertIsNode } from "../node/node" import { getSnapshot } from "../node/snapshot/getSnapshot" import { OnSnapshotListener, onSnapshot } from "../node/snapshot/onSnapshot" import { Dispose } from "../utils/disposable" export const reduxActionType = "applyAction" /** * A redux store for mobx-bonsai. */ export interface ReduxStore { getState(): T subscribe(listener: OnSnapshotListener): Dispose } /** * Generates a redux compatible store out of a mobx-bonsai object. * * @template T Object type. * @param target Root object. * @returns A redux compatible store. */ export function asReduxStore(target: T): ReduxStore { assertIsNode(target, "target") const store: ReduxStore = { getState() { return getSnapshot(target) }, subscribe(listener) { return onSnapshot(target, listener) }, } return store }