Code coverage report for lib/util/composeReducer.js

Statements: 100% (20 / 20)      Branches: 100% (10 / 10)      Functions: 100% (3 / 3)      Lines: 100% (20 / 20)      Ignored: none     

All files » lib/util/ » composeReducer.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67            1                   1   10 7     3     2         3   2 2     2   6 1     5   4 4   4 2         1           2           1  
/**
 * @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;