code: function _makeReducer (step) {
      return function (arrayLike, accumulator, initialValue) {
          var len = _toArrayLength(arrayLike.length);
          var idx = step === 1 ? 0 : len - 1;
          var nCalls;
          var result;
  
          if (arguments.length === 3) {
              nCalls = len;
              result = initialValue;
          } else {
              if (len === 0) {
                  throw new TypeError("Reduce of empty array-like with no initial value");
              }
  
              result = arrayLike[idx];
              idx += step;
              nCalls = len - 1;
          }
  
          for (; nCalls--; idx += step) {
              result = accumulator(result, arrayLike[idx], idx, arrayLike);
          }
  
          return result;
      };
  }
docs: Builds a reduce function. The <code>step</code> parameter must be <code>1</code>
  to build  {@link module:lamb.reduce|reduce} and <code>-1</code> to build
  {@link module:lamb.reduceRight|reduceRight}.
  @private
  @param {Number} step
  @returns {Function}