You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					158 lines
				
				4.4 KiB
			
		
		
			
		
	
	
					158 lines
				
				4.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'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
							 | 
						||
| 
								 | 
							
								});
							 |