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