code: function reduce(promise, reduceFunc /*, initialValue */) {
              var args = slice.call(arguments, 1);
  
              return well(promise, function (array) {
                  var total;
  
                  total = array.length;
  
                  // Wrap the supplied reduceFunc with one that handles promises and then
                  // delegates to the supplied.
                  args[0] = function (current, val, i) {
                      return well(current, function (c) {
                          return well(val, function (value) {
                              return reduceFunc(c, value, i, total);
                          });
                      });
                  };
  
                  return reduceArray.apply(array, args);
              });
          }
docs: Traditional reduce function, similar to `Array.prototype.reduce()`, but
  input may contain promises and/or values, and reduceFunc
  may return either a value or a promise, *and* initialValue may
  be a promise for the starting value.
  
  @param {Array|Promise} promise array or promise for an array of anything,
  may contain a mix of promises and values.
  @param {function} reduceFunc reduce function reduce(currentValue, nextValue, index, total),
  where total is the total number of items being reduced, and will be the same
  in each call to reduceFunc.
  @returns {Promise} that will resolve to the final reduced value