71 lines
1.6 KiB
JavaScript
71 lines
1.6 KiB
JavaScript
|
import _isArrayLike from "./_isArrayLike.js";
|
||
|
import _xwrap from "./_xwrap.js";
|
||
|
import bind from "../bind.js";
|
||
|
|
||
|
function _arrayReduce(xf, acc, list) {
|
||
|
var idx = 0;
|
||
|
var len = list.length;
|
||
|
|
||
|
while (idx < len) {
|
||
|
acc = xf['@@transducer/step'](acc, list[idx]);
|
||
|
|
||
|
if (acc && acc['@@transducer/reduced']) {
|
||
|
acc = acc['@@transducer/value'];
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
idx += 1;
|
||
|
}
|
||
|
|
||
|
return xf['@@transducer/result'](acc);
|
||
|
}
|
||
|
|
||
|
function _iterableReduce(xf, acc, iter) {
|
||
|
var step = iter.next();
|
||
|
|
||
|
while (!step.done) {
|
||
|
acc = xf['@@transducer/step'](acc, step.value);
|
||
|
|
||
|
if (acc && acc['@@transducer/reduced']) {
|
||
|
acc = acc['@@transducer/value'];
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
step = iter.next();
|
||
|
}
|
||
|
|
||
|
return xf['@@transducer/result'](acc);
|
||
|
}
|
||
|
|
||
|
function _methodReduce(xf, acc, obj, methodName) {
|
||
|
return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));
|
||
|
}
|
||
|
|
||
|
var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';
|
||
|
export default function _reduce(fn, acc, list) {
|
||
|
if (typeof fn === 'function') {
|
||
|
fn = _xwrap(fn);
|
||
|
}
|
||
|
|
||
|
if (_isArrayLike(list)) {
|
||
|
return _arrayReduce(fn, acc, list);
|
||
|
}
|
||
|
|
||
|
if (typeof list['fantasy-land/reduce'] === 'function') {
|
||
|
return _methodReduce(fn, acc, list, 'fantasy-land/reduce');
|
||
|
}
|
||
|
|
||
|
if (list[symIterator] != null) {
|
||
|
return _iterableReduce(fn, acc, list[symIterator]());
|
||
|
}
|
||
|
|
||
|
if (typeof list.next === 'function') {
|
||
|
return _iterableReduce(fn, acc, list);
|
||
|
}
|
||
|
|
||
|
if (typeof list.reduce === 'function') {
|
||
|
return _methodReduce(fn, acc, list, 'reduce');
|
||
|
}
|
||
|
|
||
|
throw new TypeError('reduce: list must be array or iterable');
|
||
|
}
|