UNPKG

genji-core

Version:

The core lightweight library for genji, based on redux and redux-saga.

81 lines (65 loc) 2.25 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.combineReducers = combineReducers; exports.default = createImmerReducer; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread")); var _immer = _interopRequireDefault(require("immer")); var _invariant = _interopRequireDefault(require("invariant")); function combineReducers(reducers) { return function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var action = arguments.length > 1 ? arguments[1] : undefined; var hasChanged = false; var nextState = {}; for (var key in reducers) { var prevStateKey = state[key]; var nextStateKey = reducers[key](prevStateKey, action); nextState[key] = nextStateKey; hasChanged = hasChanged || nextStateKey !== prevStateKey; } if (hasChanged == false) { return state; } else { return (0, _objectSpread2.default)({}, state, nextState); } }; } function createImmerReducer(reducers) { var defaultState = {}; var mutations = {}; for (var key in reducers) { defaultState[key] = reducers[key].state; for (var action in reducers[key].mutations) { mutations[action] = reducers[key].mutations[action]; } } return function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var action = arguments.length > 1 ? arguments[1] : undefined; var addState = {}; var hasAddState = false; for (var _key in defaultState) { if (_key in state == false) { addState[_key] = defaultState[_key]; hasAddState = true; } } if (hasAddState) { state = (0, _objectSpread2.default)({}, state, addState); } var type = action.type; (0, _invariant.default)(type, 'dispatch: action should be a plain Object with type'); var handler = mutations[type]; if (handler) { var ret = (0, _immer.default)(state, function (draft) { handler(draft, action); }); return ret === undefined ? {} : ret; } else { return state; } }; }