1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { Log } from '../../utils/Log'; 17import type { ActionData } from '../actions/Action'; 18import type { OhCombinedState } from '../store'; 19 20export type Reducer = ( 21 state: OhCombinedState | undefined, 22 action: ActionData) => OhCombinedState; 23 24export function combineReducers(reducers: Array<Function>): Reducer { 25 return function combination( 26 state: OhCombinedState | undefined, 27 action: ActionData 28 ) { 29 const nextState: unknown = {}; 30 const currentState = state || {}; 31 reducers.forEach((reducer: Function) => { 32 const previousStateForKey = currentState[reducer.name]; 33 const nextStateForKey = reducer(previousStateForKey, action); 34 if (!nextStateForKey) { 35 Log.error('reducer error, result is undefined.'); 36 } 37 nextState[reducer.name] = nextStateForKey; 38 }); 39 return nextState as OhCombinedState; 40 }; 41} 42