@snipsonian/observable-state
Version:
Observable-state snippets (redux-like)
41 lines (40 loc) • 1.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const createObservableStateStore_1 = require("../store/createObservableStateStore");
const createObservableStateActionMiddleware_1 = require("./createObservableStateActionMiddleware");
function createActionableObservableStateStore(config) {
const store = (0, createObservableStateStore_1.default)(config);
const middlewares = [
...(config.middlewares || []),
(0, createObservableStateActionMiddleware_1.default)({
store,
extraProcessInput: config.observableStateActionExtraProcessInput,
}),
];
store.dispatch = applyMiddleware({ store, middlewares });
return store;
}
exports.default = createActionableObservableStateStore;
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)));
}