function reduce(promise, reduceFunc /*, initialValue */) {
		var args = fcall(slice, arguments, 1);

		return when(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 when(current, function (c) {
					return when(val, function (value) {
						return reduceFunc(c, value, i, total);
					});
				});
			};

			return reduceArray.apply(array, args);
		});
	}
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