@snipsonian/observable-state
Version:
Observable-state snippets (redux-like)
38 lines (37 loc) • 1.39 kB
JavaScript
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)));
}