2 var ctx = require('./_ctx')
3 , $export = require('./_export')
4 , createDesc = require('./_property-desc')
5 , assign = require('./_object-assign')
6 , create = require('./_object-create')
7 , getPrototypeOf = require('./_object-gpo')
8 , getKeys = require('./_object-keys')
9 , dP = require('./_object-dp')
10 , keyOf = require('./_keyof')
11 , aFunction = require('./_a-function')
12 , forOf = require('./_for-of')
13 , isIterable = require('./core.is-iterable')
14 , $iterCreate = require('./_iter-create')
15 , step = require('./_iter-step')
16 , isObject = require('./_is-object')
17 , toIObject = require('./_to-iobject')
18 , DESCRIPTORS = require('./_descriptors')
19 , has = require('./_has');
29 var createDictMethod = function(TYPE){
30 var IS_MAP = TYPE == 1
31 , IS_EVERY = TYPE == 4;
32 return function(object, callbackfn, that /* = undefined */){
33 var f = ctx(callbackfn, that, 3)
34 , O = toIObject(object)
35 , result = IS_MAP || TYPE == 7 || TYPE == 2
36 ? new (typeof this == 'function' ? this : Dict) : undefined
38 for(key in O)if(has(O, key)){
40 res = f(val, key, object);
42 if(IS_MAP)result[key] = res; // map
43 else if(res)switch(TYPE){
44 case 2: result[key] = val; break; // filter
45 case 3: return true; // some
46 case 5: return val; // find
47 case 6: return key; // findKey
48 case 7: result[res[0]] = res[1]; // mapPairs
49 } else if(IS_EVERY)return false; // every
52 return TYPE == 3 || IS_EVERY ? IS_EVERY : result;
55 var findKey = createDictMethod(6);
57 var createDictIter = function(kind){
59 return new DictIterator(it, kind);
62 var DictIterator = function(iterated, kind){
63 this._t = toIObject(iterated); // target
64 this._a = getKeys(iterated); // keys
65 this._i = 0; // next index
66 this._k = kind; // kind
68 $iterCreate(DictIterator, 'Dict', function(){
75 if(that._i >= keys.length){
79 } while(!has(O, key = keys[that._i++]));
80 if(kind == 'keys' )return step(0, key);
81 if(kind == 'values')return step(0, O[key]);
82 return step(0, [key, O[key]]);
85 function Dict(iterable){
86 var dict = create(null);
87 if(iterable != undefined){
88 if(isIterable(iterable)){
89 forOf(iterable, true, function(key, value){
92 } else assign(dict, iterable);
96 Dict.prototype = null;
98 function reduce(object, mapfn, init){
100 var O = toIObject(object)
102 , length = keys.length
105 if(arguments.length < 3){
106 if(!length)throw TypeError('Reduce of empty object with no initial value');
108 } else memo = Object(init);
109 while(length > i)if(has(O, key = keys[i++])){
110 memo = mapfn(memo, O[key], key, object);
115 function includes(object, el){
116 return (el == el ? keyOf(object, el) : findKey(object, function(it){
121 function get(object, key){
122 if(has(object, key))return object[key];
124 function set(object, key, value){
125 if(DESCRIPTORS && key in Object)dP.f(object, key, createDesc(0, value));
126 else object[key] = value;
131 return isObject(it) && getPrototypeOf(it) === Dict.prototype;
134 $export($export.G + $export.F, {Dict: Dict});
136 $export($export.S, 'Dict', {
137 keys: createDictIter('keys'),
138 values: createDictIter('values'),
139 entries: createDictIter('entries'),
140 forEach: createDictMethod(0),
141 map: createDictMethod(1),
142 filter: createDictMethod(2),
143 some: createDictMethod(3),
144 every: createDictMethod(4),
145 find: createDictMethod(5),
147 mapPairs: createDictMethod(7),