core-js
Version:
Standard library
137 lines (132 loc) • 4.31 kB
JavaScript
!function(DICT){
function Dict(iterable){
var dict = create(null);
if(iterable != undefined){
if(isIterable(iterable)){
for(var iter = getIterator(iterable), step, value; !(step = iter.next()).done;){
value = step.value;
dict[value[0]] = value[1];
}
} else assign(dict, iterable);
}
return dict;
}
Dict[PROTOTYPE] = null;
function DictIterator(iterated, kind){
set(this, ITER, {o: ES5Object(iterated), a: getKeys(iterated), i: 0, k: kind});
}
createIterator(DictIterator, DICT, function(){
var iter = this[ITER]
, O = iter.o
, keys = iter.a
, kind = iter.k
, key;
while(true){
if(iter.i >= keys.length)return iterResult(1);
if(has(O, key = keys[iter.i++]))break;
}
if(kind == KEY) return iterResult(0, key);
if(kind == VALUE)return iterResult(0, O[key]);
return iterResult(0, [key, O[key]]);
});
function createDictIter(kind){
return function(it){
return new DictIterator(it, kind);
}
}
/*
* 0 -> forEach
* 1 -> map
* 2 -> filter
* 3 -> some
* 4 -> every
* 5 -> find
* 6 -> findKey
* 7 -> mapPairs
*/
function createDictMethod(type){
var isMap = type == 1
, isEvery = type == 4;
return function(object, callbackfn, that /* = undefined */){
var f = ctx(callbackfn, that, 3)
, O = ES5Object(object)
, result = isMap || type == 7 || type == 2 ? new (generic(this, Dict)) : undefined
, key, val, res;
for(key in O)if(has(O, key)){
val = O[key];
res = f(val, key, object);
if(type){
if(isMap)result[key] = res; // map
else if(res)switch(type){
case 2: result[key] = val; break // filter
case 3: return true; // some
case 5: return val; // find
case 6: return key; // findKey
case 7: result[res[0]] = res[1]; // mapPairs
} else if(isEvery)return false; // every
}
}
return type == 3 || isEvery ? isEvery : result;
}
}
function createDictReduce(isTurn){
return function(object, mapfn, init){
assertFunction(mapfn);
var O = ES5Object(object)
, keys = getKeys(O)
, length = keys.length
, i = 0
, memo, key, result;
if(isTurn)memo = init == undefined ? new (generic(this, Dict)) : Object(init);
else if(arguments.length < 3){
assert(length, REDUCE_ERROR);
memo = O[keys[i++]];
} else memo = Object(init);
while(length > i)if(has(O, key = keys[i++])){
result = mapfn(memo, O[key], key, object);
if(isTurn){
if(result === false)break;
} else memo = result;
}
return memo;
}
}
var findKey = createDictMethod(6);
function includes(object, el){
return (el == el ? keyOf(object, el) : findKey(object, sameNaN)) !== undefined;
}
var dictMethods = {
keys: createDictIter(KEY),
values: createDictIter(VALUE),
entries: createDictIter(KEY+VALUE),
forEach: createDictMethod(0),
map: createDictMethod(1),
filter: createDictMethod(2),
some: createDictMethod(3),
every: createDictMethod(4),
find: createDictMethod(5),
findKey: findKey,
mapPairs:createDictMethod(7),
reduce: createDictReduce(false),
turn: createDictReduce(true),
keyOf: keyOf,
includes:includes,
// Has / get / set own property
has: has,
get: get,
set: createDefiner(0),
isDict: function(it){
return isObject(it) && getPrototypeOf(it) === Dict[PROTOTYPE];
}
};
if(REFERENCE_GET)for(var key in dictMethods)!function(fn){
function method(){
for(var args = [this], i = 0; i < arguments.length;)args.push(arguments[i++]);
return invoke(fn, args);
}
fn[REFERENCE_GET] = function(){
return method;
}
}(dictMethods[key]);
$define(GLOBAL + FORCED, {Dict: assignHidden(Dict, dictMethods)});
}('Dict');