| 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; |