registerExternalReducers = reducers => {
  const reducerKeys = Object.keys(reducers);

  return function combination(state, action) {
    if (state === undefined) {
      state = {};
    }
    let hasChanged = false;
    const nextState = {};

    for (let i = 0; i < reducerKeys.length; i++) {
      const key = reducerKeys[i];
      const reducer = reducers[key];
      const previousStateForKey = state[key] || {};
      const nextStateForKey = reducer(previousStateForKey, action);

      nextState[key] = nextStateForKey;
      hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
    }
    return hasChanged ? {...state, ...nextState} : state;
  };
}
like `combineReducers`, but doesn't enforce each key in `state` is controled by one reducer.
If some keys in `state` do not exist in `reducers`, those fields will stay the same in the returned state
@param  {Object} reducers - key-value pairs of reducers; e.g. {keplerGl: keplerGlReducer, otherLib: reducerForOtherLib}
@return {Function} - a reducer, takes params: `state`, `action`, returns updated state
e.g.
{
   manifoldState1: ...
   manifoldState2: ...
   keplerGl: ...
   otherLib: ...
}