import {combineReducers} from 'redux'; import {all, call} from 'redux-saga/effects'; export function createMapDispatchToProps(ducks) { return (dispatch) => { const map = {}; for (const i in ducks) { map[i] = {}; for (const j in ducks[i].actions.creators) { map[i][j] = (...args) => { return dispatch(ducks[i].actions.creators[j](...args)); } } } return map; }; } export function createReducer(ducks) { const map = {}; for (const i in ducks) { map[i] = ducks[i].reducer; } return combineReducers(map); } export function createSaga(ducks) { const sagas = []; for (const i in ducks) { if (!ducks[i].saga) { continue; } sagas.push(call(ducks[i].saga)); } return function* () { yield all(sagas); } } export function compose(ducks) { return { reducer: createReducer(ducks), saga: createSaga(ducks), } }