123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- 'use strict';
- var ctx = require('./_ctx');
- var $export = require('./_export');
- var createDesc = require('./_property-desc');
- var assign = require('./_object-assign');
- var create = require('./_object-create');
- var getPrototypeOf = require('./_object-gpo');
- var getKeys = require('./_object-keys');
- var dP = require('./_object-dp');
- var keyOf = require('./_keyof');
- var aFunction = require('./_a-function');
- var forOf = require('./_for-of');
- var isIterable = require('./core.is-iterable');
- var $iterCreate = require('./_iter-create');
- var step = require('./_iter-step');
- var isObject = require('./_is-object');
- var toIObject = require('./_to-iobject');
- var DESCRIPTORS = require('./_descriptors');
- var has = require('./_has');
- // 0 -> Dict.forEach
- // 1 -> Dict.map
- // 2 -> Dict.filter
- // 3 -> Dict.some
- // 4 -> Dict.every
- // 5 -> Dict.find
- // 6 -> Dict.findKey
- // 7 -> Dict.mapPairs
- var createDictMethod = function (TYPE) {
- var IS_MAP = TYPE == 1;
- var IS_EVERY = TYPE == 4;
- return function (object, callbackfn, that /* = undefined */) {
- var f = ctx(callbackfn, that, 3);
- var O = toIObject(object);
- var result = IS_MAP || TYPE == 7 || TYPE == 2
- ? new (typeof this == 'function' ? this : Dict)() : undefined;
- var key, val, res;
- for (key in O) if (has(O, key)) {
- val = O[key];
- res = f(val, key, object);
- if (TYPE) {
- if (IS_MAP) 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 (IS_EVERY) return false; // every
- }
- }
- return TYPE == 3 || IS_EVERY ? IS_EVERY : result;
- };
- };
- var findKey = createDictMethod(6);
- var createDictIter = function (kind) {
- return function (it) {
- return new DictIterator(it, kind);
- };
- };
- var DictIterator = function (iterated, kind) {
- this._t = toIObject(iterated); // target
- this._a = getKeys(iterated); // keys
- this._i = 0; // next index
- this._k = kind; // kind
- };
- $iterCreate(DictIterator, 'Dict', function () {
- var that = this;
- var O = that._t;
- var keys = that._a;
- var kind = that._k;
- var key;
- do {
- if (that._i >= keys.length) {
- that._t = undefined;
- return step(1);
- }
- } while (!has(O, key = keys[that._i++]));
- if (kind == 'keys') return step(0, key);
- if (kind == 'values') return step(0, O[key]);
- return step(0, [key, O[key]]);
- });
- function Dict(iterable) {
- var dict = create(null);
- if (iterable != undefined) {
- if (isIterable(iterable)) {
- forOf(iterable, true, function (key, value) {
- dict[key] = value;
- });
- } else assign(dict, iterable);
- }
- return dict;
- }
- Dict.prototype = null;
- function reduce(object, mapfn, init) {
- aFunction(mapfn);
- var O = toIObject(object);
- var keys = getKeys(O);
- var length = keys.length;
- var i = 0;
- var memo, key;
- if (arguments.length < 3) {
- if (!length) throw TypeError('Reduce of empty object with no initial value');
- memo = O[keys[i++]];
- } else memo = Object(init);
- while (length > i) if (has(O, key = keys[i++])) {
- memo = mapfn(memo, O[key], key, object);
- }
- return memo;
- }
- function includes(object, el) {
- // eslint-disable-next-line no-self-compare
- return (el == el ? keyOf(object, el) : findKey(object, function (it) {
- // eslint-disable-next-line no-self-compare
- return it != it;
- })) !== undefined;
- }
- function get(object, key) {
- if (has(object, key)) return object[key];
- }
- function set(object, key, value) {
- if (DESCRIPTORS && key in Object) dP.f(object, key, createDesc(0, value));
- else object[key] = value;
- return object;
- }
- function isDict(it) {
- return isObject(it) && getPrototypeOf(it) === Dict.prototype;
- }
- $export($export.G + $export.F, { Dict: Dict });
- $export($export.S, 'Dict', {
- keys: createDictIter('keys'),
- values: createDictIter('values'),
- entries: createDictIter('entries'),
- forEach: createDictMethod(0),
- map: createDictMethod(1),
- filter: createDictMethod(2),
- some: createDictMethod(3),
- every: createDictMethod(4),
- find: createDictMethod(5),
- findKey: findKey,
- mapPairs: createDictMethod(7),
- reduce: reduce,
- keyOf: keyOf,
- includes: includes,
- has: has,
- get: get,
- set: set,
- isDict: isDict
- });
|