UNPKG

typesafe-actions-reducer-builder

Version:

Reducer builder for typesafe-actions, including immer for reducer's output

55 lines 2.17 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var immer_1 = __importDefault(require("immer")); // Implementation /** * Create a reducer builder, starting from its state. * It supports multiple actions (from typesafe-actions) with multiple reducers. * When the reducers are all set, just call build() to create the root reducer. * * It uses immer, which will produce an Immutable<TState> object as the result * of the reducer. The developer should edit the state in the reducer, instead * of creating a new one: immer will take care of creating a new object. * * The builder will provide type hints along all the build structure, lowering * the possibility of creating bugs. * * @param initialState the reducer's initial state */ function createReducerBuilder(initialState) { var reducersMap = {}; var rootReducer = function (state, action) { if (state === void 0) { state = initialState; } var reducers = reducersMap[action.type] || []; reducers.forEach(function (reducer) { state = reducer(state, action); }); return state; }; var build = function () { return immer_1.default(rootReducer); }; var reducerBuilder = {}; var handlerBuilder = function (actionCreatorBuilder) { var handler = {}; // Get the action's type var type = actionCreatorBuilder(null, null).type; var addReducer = function (reducer) { if (!(type in reducersMap)) { reducersMap[type] = []; } reducersMap[type].push(reducer); return handler; }; handler.reducer = addReducer; handler.handle = handlerBuilder; handler.build = build; return handler; }; reducerBuilder.build = build; reducerBuilder.handle = handlerBuilder; return reducerBuilder; } exports.default = createReducerBuilder; //# sourceMappingURL=createReducerBuilder.js.map