UNPKG

@snipsonian/observable-state

Version:

Observable-state snippets (redux-like)

38 lines (37 loc) 1.39 kB
import createObservableStateStore from '../store/createObservableStateStore'; import createObservableStateActionMiddleware from './createObservableStateActionMiddleware'; export default function createActionableObservableStateStore(config) { const store = createObservableStateStore(config); const middlewares = [ ...(config.middlewares || []), createObservableStateActionMiddleware({ store, extraProcessInput: config.observableStateActionExtraProcessInput, }), ]; store.dispatch = applyMiddleware({ store, middlewares }); return store; } function applyMiddleware({ store, middlewares, }) { let dispatch = () => { throw new Error('Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.'); }; const middlewareAPI = { getState: store.getState, dispatch: (...args) => dispatch(...args), }; const innerDispatch = (action) => action; const chain = middlewares.map((middleware) => middleware(middlewareAPI)); dispatch = compose(...chain)(innerDispatch); return dispatch; } function compose(...funcs) { if (funcs.length === 0) { return (arg) => arg; } if (funcs.length === 1) { return funcs[0]; } return funcs.reduce((a, b) => (...args) => a(b(...args))); }