mirror of
https://github.com/swc-project/swc.git
synced 2024-12-29 16:42:28 +03:00
64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
// Loaded from https://deno.land/x/ramda@v0.27.2/source/internal/_reduce.js
|
|
|
|
|
|
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');
|
|
}
|