7 // 6 -> Array#findIndex
8 var ctx = require('./_ctx')
9 , IObject = require('./_iobject')
10 , toObject = require('./_to-object')
11 , toLength = require('./_to-length')
12 , asc = require('./_array-species-create');
13 module.exports = function(TYPE, $create){
14 var IS_MAP = TYPE == 1
15 , IS_FILTER = TYPE == 2
17 , IS_EVERY = TYPE == 4
18 , IS_FIND_INDEX = TYPE == 6
19 , NO_HOLES = TYPE == 5 || IS_FIND_INDEX
20 , create = $create || asc;
21 return function($this, callbackfn, that){
22 var O = toObject($this)
24 , f = ctx(callbackfn, that, 3)
25 , length = toLength(self.length)
27 , result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined
29 for(;length > index; index++)if(NO_HOLES || index in self){
31 res = f(val, index, O);
33 if(IS_MAP)result[index] = res; // map
34 else if(res)switch(TYPE){
35 case 3: return true; // some
36 case 5: return val; // find
37 case 6: return index; // findIndex
38 case 2: result.push(val); // filter
39 } else if(IS_EVERY)return false; // every
42 return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;