var ctx = require('./_ctx');
|
var call = require('./_iter-call');
|
var isArrayIter = require('./_is-array-iter');
|
var anObject = require('./_an-object');
|
var toLength = require('./_to-length');
|
var getIterFn = require('./core.get-iterator-method');
|
var BREAK = {};
|
var RETURN = {};
|
var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
|
var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);
|
var f = ctx(fn, that, entries ? 2 : 1);
|
var index = 0;
|
var length, step, iterator, result;
|
if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
|
// fast case for arrays with default iterator
|
if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
|
result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
|
if (result === BREAK || result === RETURN) return result;
|
} else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
|
result = call(iterator, f, step.value, entries);
|
if (result === BREAK || result === RETURN) return result;
|
}
|
};
|
exports.BREAK = BREAK;
|
exports.RETURN = RETURN;
|