Source: util/composeReducer.js

/**
 * @file 合成reducer
 * @author Leon(leon@outlook.com)
 * @requires underscore
 */

var u = require('underscore');

/**
 * 合成reducer
 *
 * @public
 * @method module:ei.composeReducer
 * @param {...(Function | Object)} reducers 一个reducer,或多个reducer的map
 * @return {Function}
 */
function composeReducer(reducers) {

    if (u.isFunction(reducers)) {
        return reducers;
    }

    reducers = u.reduce(
        u.toArray(arguments),
        function (finalReducer, reducer) {
            return u.extendOwn(finalReducer, reducer);
        },
        {}
    );

    return function (state, action) {

        var isChanged = false;
        var nextState = {};


        for (var name in state) {

            if (!u.has(state, name)) {
                continue;
            }

            if (u.has(reducers, name)) {

                var value = state[name];
                var nextValue = nextState[name] = reducers[name](value, action);

                if (nextValue !== value) {
                    isChanged = true;
                }

            }
            else {
                nextState[name] = state[name];
            }


        }

        return isChanged ? nextState : state;

    };

}

module.exports = composeReducer;