in packages/redux-dynamic-modules-core/src/Managers/ReducerManager.ts [48:97]
export function getReducerManager<S extends {}>(
initialReducers: ReducersMapObject<S>,
reducerCombiner: (
reducers: ReducersMapObject<S, any>
) => Reducer<S> = combineReducers
): IReducerManager<S> {
let combinedReducer = reducerCombiner(initialReducers);
const reducers: ReducersMapObject<S> = {
...(initialReducers as object),
} as ReducersMapObject<S>;
let keysToRemove = [];
const reduce = (state: S, action: AnyAction) => {
if (keysToRemove.length > 0) {
state = { ...(state as any) };
for (let key of keysToRemove) {
delete state[key];
}
keysToRemove = [];
}
if (state === undefined) {
state = {} as S;
}
return combinedReducer(state, action);
};
return {
getReducerMap: () => reducers,
reduce,
add: <ReducerState>(key: string, reducer: Reducer<ReducerState>) => {
if (!key || reducers[key]) {
return;
}
reducers[key] = reducer;
combinedReducer = getCombinedReducer(reducers, reducerCombiner);
},
remove: (key: string) => {
if (!key || !reducers[key]) {
return;
}
delete reducers[key];
keysToRemove.push(key);
combinedReducer = getCombinedReducer(reducers, reducerCombiner);
},
};
}