|
|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
/**
|
|
|
|
|
* lodash 4.6.1 (Custom Build) <https://lodash.com/>
|
|
|
|
|
* lodash (Custom Build) <https://lodash.com/>
|
|
|
|
|
* Build: `lodash modularize exports="npm" -o ./`
|
|
|
|
|
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
|
|
|
|
|
* Released under MIT license <https://lodash.com/license>
|
|
|
|
|
@@ -19,7 +19,8 @@ var UNORDERED_COMPARE_FLAG = 1,
|
|
|
|
|
PARTIAL_COMPARE_FLAG = 2;
|
|
|
|
|
|
|
|
|
|
/** Used as references for various `Number` constants. */
|
|
|
|
|
var MAX_SAFE_INTEGER = 9007199254740991;
|
|
|
|
|
var INFINITY = 1 / 0,
|
|
|
|
|
MAX_SAFE_INTEGER = 9007199254740991;
|
|
|
|
|
|
|
|
|
|
/** `Object#toString` result references. */
|
|
|
|
|
var argsTag = '[object Arguments]',
|
|
|
|
|
@@ -189,7 +190,7 @@ function baseTimes(n, iteratee) {
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} object The object to query.
|
|
|
|
|
* @param {Array} props The property names to get values for.
|
|
|
|
|
* @returns {Object} Returns the new array of key-value pairs.
|
|
|
|
|
* @returns {Object} Returns the key-value pairs.
|
|
|
|
|
*/
|
|
|
|
|
function baseToPairs(object, props) {
|
|
|
|
|
return arrayMap(props, function(key) {
|
|
|
|
|
@@ -228,25 +229,11 @@ function isHostObject(value) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Checks if `value` is a valid array-like index.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {*} value The value to check.
|
|
|
|
|
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
|
|
|
|
|
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function isIndex(value, length) {
|
|
|
|
|
value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
|
|
|
|
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|
|
|
|
return value > -1 && value % 1 == 0 && value < length;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Converts `map` to an array.
|
|
|
|
|
* Converts `map` to its key-value pairs.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} map The map to convert.
|
|
|
|
|
* @returns {Array} Returns the converted array.
|
|
|
|
|
* @returns {Array} Returns the key-value pairs.
|
|
|
|
|
*/
|
|
|
|
|
function mapToArray(map) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
@@ -259,11 +246,11 @@ function mapToArray(map) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Converts `set` to an array.
|
|
|
|
|
* Converts `set` to an array of its values.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} set The set to convert.
|
|
|
|
|
* @returns {Array} Returns the converted array.
|
|
|
|
|
* @returns {Array} Returns the values.
|
|
|
|
|
*/
|
|
|
|
|
function setToArray(set) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
@@ -275,6 +262,23 @@ function setToArray(set) {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Converts `set` to its value-value pairs.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} set The set to convert.
|
|
|
|
|
* @returns {Array} Returns the value-value pairs.
|
|
|
|
|
*/
|
|
|
|
|
function setToPairs(set) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
result = Array(set.size);
|
|
|
|
|
|
|
|
|
|
set.forEach(function(value) {
|
|
|
|
|
result[++index] = [value, value];
|
|
|
|
|
});
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Used for built-in method references. */
|
|
|
|
|
var arrayProto = Array.prototype,
|
|
|
|
|
objectProto = Object.prototype;
|
|
|
|
|
@@ -332,79 +336,225 @@ var symbolProto = Symbol ? Symbol.prototype : undefined,
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @constructor
|
|
|
|
|
* @returns {Object} Returns the new hash object.
|
|
|
|
|
* @param {Array} [entries] The key-value pairs to cache.
|
|
|
|
|
*/
|
|
|
|
|
function Hash() {}
|
|
|
|
|
function Hash(entries) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
length = entries ? entries.length : 0;
|
|
|
|
|
|
|
|
|
|
this.clear();
|
|
|
|
|
while (++index < length) {
|
|
|
|
|
var entry = entries[index];
|
|
|
|
|
this.set(entry[0], entry[1]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Removes all key-value entries from the hash.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name clear
|
|
|
|
|
* @memberOf Hash
|
|
|
|
|
*/
|
|
|
|
|
function hashClear() {
|
|
|
|
|
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Removes `key` and its value from the hash.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name delete
|
|
|
|
|
* @memberOf Hash
|
|
|
|
|
* @param {Object} hash The hash to modify.
|
|
|
|
|
* @param {string} key The key of the value to remove.
|
|
|
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function hashDelete(hash, key) {
|
|
|
|
|
return hashHas(hash, key) && delete hash[key];
|
|
|
|
|
function hashDelete(key) {
|
|
|
|
|
return this.has(key) && delete this.__data__[key];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets the hash value for `key`.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} hash The hash to query.
|
|
|
|
|
* @name get
|
|
|
|
|
* @memberOf Hash
|
|
|
|
|
* @param {string} key The key of the value to get.
|
|
|
|
|
* @returns {*} Returns the entry value.
|
|
|
|
|
*/
|
|
|
|
|
function hashGet(hash, key) {
|
|
|
|
|
function hashGet(key) {
|
|
|
|
|
var data = this.__data__;
|
|
|
|
|
if (nativeCreate) {
|
|
|
|
|
var result = hash[key];
|
|
|
|
|
var result = data[key];
|
|
|
|
|
return result === HASH_UNDEFINED ? undefined : result;
|
|
|
|
|
}
|
|
|
|
|
return hasOwnProperty.call(hash, key) ? hash[key] : undefined;
|
|
|
|
|
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Checks if a hash value for `key` exists.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} hash The hash to query.
|
|
|
|
|
* @name has
|
|
|
|
|
* @memberOf Hash
|
|
|
|
|
* @param {string} key The key of the entry to check.
|
|
|
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function hashHas(hash, key) {
|
|
|
|
|
return nativeCreate ? hash[key] !== undefined : hasOwnProperty.call(hash, key);
|
|
|
|
|
function hashHas(key) {
|
|
|
|
|
var data = this.__data__;
|
|
|
|
|
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the hash `key` to `value`.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} hash The hash to modify.
|
|
|
|
|
* @name set
|
|
|
|
|
* @memberOf Hash
|
|
|
|
|
* @param {string} key The key of the value to set.
|
|
|
|
|
* @param {*} value The value to set.
|
|
|
|
|
* @returns {Object} Returns the hash instance.
|
|
|
|
|
*/
|
|
|
|
|
function hashSet(hash, key, value) {
|
|
|
|
|
hash[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
|
|
|
|
function hashSet(key, value) {
|
|
|
|
|
var data = this.__data__;
|
|
|
|
|
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Avoid inheriting from `Object.prototype` when possible.
|
|
|
|
|
Hash.prototype = nativeCreate ? nativeCreate(null) : objectProto;
|
|
|
|
|
// Add methods to `Hash`.
|
|
|
|
|
Hash.prototype.clear = hashClear;
|
|
|
|
|
Hash.prototype['delete'] = hashDelete;
|
|
|
|
|
Hash.prototype.get = hashGet;
|
|
|
|
|
Hash.prototype.has = hashHas;
|
|
|
|
|
Hash.prototype.set = hashSet;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates an list cache object.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @constructor
|
|
|
|
|
* @param {Array} [entries] The key-value pairs to cache.
|
|
|
|
|
*/
|
|
|
|
|
function ListCache(entries) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
length = entries ? entries.length : 0;
|
|
|
|
|
|
|
|
|
|
this.clear();
|
|
|
|
|
while (++index < length) {
|
|
|
|
|
var entry = entries[index];
|
|
|
|
|
this.set(entry[0], entry[1]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Removes all key-value entries from the list cache.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name clear
|
|
|
|
|
* @memberOf ListCache
|
|
|
|
|
*/
|
|
|
|
|
function listCacheClear() {
|
|
|
|
|
this.__data__ = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Removes `key` and its value from the list cache.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name delete
|
|
|
|
|
* @memberOf ListCache
|
|
|
|
|
* @param {string} key The key of the value to remove.
|
|
|
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function listCacheDelete(key) {
|
|
|
|
|
var data = this.__data__,
|
|
|
|
|
index = assocIndexOf(data, key);
|
|
|
|
|
|
|
|
|
|
if (index < 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
var lastIndex = data.length - 1;
|
|
|
|
|
if (index == lastIndex) {
|
|
|
|
|
data.pop();
|
|
|
|
|
} else {
|
|
|
|
|
splice.call(data, index, 1);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets the list cache value for `key`.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name get
|
|
|
|
|
* @memberOf ListCache
|
|
|
|
|
* @param {string} key The key of the value to get.
|
|
|
|
|
* @returns {*} Returns the entry value.
|
|
|
|
|
*/
|
|
|
|
|
function listCacheGet(key) {
|
|
|
|
|
var data = this.__data__,
|
|
|
|
|
index = assocIndexOf(data, key);
|
|
|
|
|
|
|
|
|
|
return index < 0 ? undefined : data[index][1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Checks if a list cache value for `key` exists.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name has
|
|
|
|
|
* @memberOf ListCache
|
|
|
|
|
* @param {string} key The key of the entry to check.
|
|
|
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function listCacheHas(key) {
|
|
|
|
|
return assocIndexOf(this.__data__, key) > -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the list cache `key` to `value`.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name set
|
|
|
|
|
* @memberOf ListCache
|
|
|
|
|
* @param {string} key The key of the value to set.
|
|
|
|
|
* @param {*} value The value to set.
|
|
|
|
|
* @returns {Object} Returns the list cache instance.
|
|
|
|
|
*/
|
|
|
|
|
function listCacheSet(key, value) {
|
|
|
|
|
var data = this.__data__,
|
|
|
|
|
index = assocIndexOf(data, key);
|
|
|
|
|
|
|
|
|
|
if (index < 0) {
|
|
|
|
|
data.push([key, value]);
|
|
|
|
|
} else {
|
|
|
|
|
data[index][1] = value;
|
|
|
|
|
}
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add methods to `ListCache`.
|
|
|
|
|
ListCache.prototype.clear = listCacheClear;
|
|
|
|
|
ListCache.prototype['delete'] = listCacheDelete;
|
|
|
|
|
ListCache.prototype.get = listCacheGet;
|
|
|
|
|
ListCache.prototype.has = listCacheHas;
|
|
|
|
|
ListCache.prototype.set = listCacheSet;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates a map cache object to store key-value pairs.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @constructor
|
|
|
|
|
* @param {Array} [values] The values to cache.
|
|
|
|
|
* @param {Array} [entries] The key-value pairs to cache.
|
|
|
|
|
*/
|
|
|
|
|
function MapCache(values) {
|
|
|
|
|
function MapCache(entries) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
length = values ? values.length : 0;
|
|
|
|
|
length = entries ? entries.length : 0;
|
|
|
|
|
|
|
|
|
|
this.clear();
|
|
|
|
|
while (++index < length) {
|
|
|
|
|
var entry = values[index];
|
|
|
|
|
var entry = entries[index];
|
|
|
|
|
this.set(entry[0], entry[1]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -416,10 +566,10 @@ function MapCache(values) {
|
|
|
|
|
* @name clear
|
|
|
|
|
* @memberOf MapCache
|
|
|
|
|
*/
|
|
|
|
|
function mapClear() {
|
|
|
|
|
function mapCacheClear() {
|
|
|
|
|
this.__data__ = {
|
|
|
|
|
'hash': new Hash,
|
|
|
|
|
'map': Map ? new Map : [],
|
|
|
|
|
'map': new (Map || ListCache),
|
|
|
|
|
'string': new Hash
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
@@ -433,12 +583,8 @@ function mapClear() {
|
|
|
|
|
* @param {string} key The key of the value to remove.
|
|
|
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function mapDelete(key) {
|
|
|
|
|
var data = this.__data__;
|
|
|
|
|
if (isKeyable(key)) {
|
|
|
|
|
return hashDelete(typeof key == 'string' ? data.string : data.hash, key);
|
|
|
|
|
}
|
|
|
|
|
return Map ? data.map['delete'](key) : assocDelete(data.map, key);
|
|
|
|
|
function mapCacheDelete(key) {
|
|
|
|
|
return getMapData(this, key)['delete'](key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -450,12 +596,8 @@ function mapDelete(key) {
|
|
|
|
|
* @param {string} key The key of the value to get.
|
|
|
|
|
* @returns {*} Returns the entry value.
|
|
|
|
|
*/
|
|
|
|
|
function mapGet(key) {
|
|
|
|
|
var data = this.__data__;
|
|
|
|
|
if (isKeyable(key)) {
|
|
|
|
|
return hashGet(typeof key == 'string' ? data.string : data.hash, key);
|
|
|
|
|
}
|
|
|
|
|
return Map ? data.map.get(key) : assocGet(data.map, key);
|
|
|
|
|
function mapCacheGet(key) {
|
|
|
|
|
return getMapData(this, key).get(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -467,12 +609,8 @@ function mapGet(key) {
|
|
|
|
|
* @param {string} key The key of the entry to check.
|
|
|
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function mapHas(key) {
|
|
|
|
|
var data = this.__data__;
|
|
|
|
|
if (isKeyable(key)) {
|
|
|
|
|
return hashHas(typeof key == 'string' ? data.string : data.hash, key);
|
|
|
|
|
}
|
|
|
|
|
return Map ? data.map.has(key) : assocHas(data.map, key);
|
|
|
|
|
function mapCacheHas(key) {
|
|
|
|
|
return getMapData(this, key).has(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -485,41 +623,77 @@ function mapHas(key) {
|
|
|
|
|
* @param {*} value The value to set.
|
|
|
|
|
* @returns {Object} Returns the map cache instance.
|
|
|
|
|
*/
|
|
|
|
|
function mapSet(key, value) {
|
|
|
|
|
var data = this.__data__;
|
|
|
|
|
if (isKeyable(key)) {
|
|
|
|
|
hashSet(typeof key == 'string' ? data.string : data.hash, key, value);
|
|
|
|
|
} else if (Map) {
|
|
|
|
|
data.map.set(key, value);
|
|
|
|
|
} else {
|
|
|
|
|
assocSet(data.map, key, value);
|
|
|
|
|
}
|
|
|
|
|
function mapCacheSet(key, value) {
|
|
|
|
|
getMapData(this, key).set(key, value);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add methods to `MapCache`.
|
|
|
|
|
MapCache.prototype.clear = mapClear;
|
|
|
|
|
MapCache.prototype['delete'] = mapDelete;
|
|
|
|
|
MapCache.prototype.get = mapGet;
|
|
|
|
|
MapCache.prototype.has = mapHas;
|
|
|
|
|
MapCache.prototype.set = mapSet;
|
|
|
|
|
MapCache.prototype.clear = mapCacheClear;
|
|
|
|
|
MapCache.prototype['delete'] = mapCacheDelete;
|
|
|
|
|
MapCache.prototype.get = mapCacheGet;
|
|
|
|
|
MapCache.prototype.has = mapCacheHas;
|
|
|
|
|
MapCache.prototype.set = mapCacheSet;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* Creates an array cache object to store unique values.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @constructor
|
|
|
|
|
* @param {Array} [values] The values to cache.
|
|
|
|
|
*/
|
|
|
|
|
function SetCache(values) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
length = values ? values.length : 0;
|
|
|
|
|
|
|
|
|
|
this.__data__ = new MapCache;
|
|
|
|
|
while (++index < length) {
|
|
|
|
|
this.add(values[index]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Adds `value` to the array cache.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name add
|
|
|
|
|
* @memberOf SetCache
|
|
|
|
|
* @alias push
|
|
|
|
|
* @param {*} value The value to cache.
|
|
|
|
|
* @returns {Object} Returns the cache instance.
|
|
|
|
|
*/
|
|
|
|
|
function setCacheAdd(value) {
|
|
|
|
|
this.__data__.set(value, HASH_UNDEFINED);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Checks if `value` is in the array cache.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @name has
|
|
|
|
|
* @memberOf SetCache
|
|
|
|
|
* @param {*} value The value to search for.
|
|
|
|
|
* @returns {number} Returns `true` if `value` is found, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function setCacheHas(value) {
|
|
|
|
|
return this.__data__.has(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add methods to `SetCache`.
|
|
|
|
|
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
|
|
|
|
|
SetCache.prototype.has = setCacheHas;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates a stack cache object to store key-value pairs.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @constructor
|
|
|
|
|
* @param {Array} [values] The values to cache.
|
|
|
|
|
* @param {Array} [entries] The key-value pairs to cache.
|
|
|
|
|
*/
|
|
|
|
|
function Stack(values) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
length = values ? values.length : 0;
|
|
|
|
|
|
|
|
|
|
this.clear();
|
|
|
|
|
while (++index < length) {
|
|
|
|
|
var entry = values[index];
|
|
|
|
|
this.set(entry[0], entry[1]);
|
|
|
|
|
}
|
|
|
|
|
function Stack(entries) {
|
|
|
|
|
this.__data__ = new ListCache(entries);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -530,7 +704,7 @@ function Stack(values) {
|
|
|
|
|
* @memberOf Stack
|
|
|
|
|
*/
|
|
|
|
|
function stackClear() {
|
|
|
|
|
this.__data__ = { 'array': [], 'map': null };
|
|
|
|
|
this.__data__ = new ListCache;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -543,10 +717,7 @@ function stackClear() {
|
|
|
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function stackDelete(key) {
|
|
|
|
|
var data = this.__data__,
|
|
|
|
|
array = data.array;
|
|
|
|
|
|
|
|
|
|
return array ? assocDelete(array, key) : data.map['delete'](key);
|
|
|
|
|
return this.__data__['delete'](key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -559,10 +730,7 @@ function stackDelete(key) {
|
|
|
|
|
* @returns {*} Returns the entry value.
|
|
|
|
|
*/
|
|
|
|
|
function stackGet(key) {
|
|
|
|
|
var data = this.__data__,
|
|
|
|
|
array = data.array;
|
|
|
|
|
|
|
|
|
|
return array ? assocGet(array, key) : data.map.get(key);
|
|
|
|
|
return this.__data__.get(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -575,10 +743,7 @@ function stackGet(key) {
|
|
|
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function stackHas(key) {
|
|
|
|
|
var data = this.__data__,
|
|
|
|
|
array = data.array;
|
|
|
|
|
|
|
|
|
|
return array ? assocHas(array, key) : data.map.has(key);
|
|
|
|
|
return this.__data__.has(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -592,21 +757,11 @@ function stackHas(key) {
|
|
|
|
|
* @returns {Object} Returns the stack cache instance.
|
|
|
|
|
*/
|
|
|
|
|
function stackSet(key, value) {
|
|
|
|
|
var data = this.__data__,
|
|
|
|
|
array = data.array;
|
|
|
|
|
|
|
|
|
|
if (array) {
|
|
|
|
|
if (array.length < (LARGE_ARRAY_SIZE - 1)) {
|
|
|
|
|
assocSet(array, key, value);
|
|
|
|
|
} else {
|
|
|
|
|
data.array = null;
|
|
|
|
|
data.map = new MapCache(array);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var map = data.map;
|
|
|
|
|
if (map) {
|
|
|
|
|
map.set(key, value);
|
|
|
|
|
var cache = this.__data__;
|
|
|
|
|
if (cache instanceof ListCache && cache.__data__.length == LARGE_ARRAY_SIZE) {
|
|
|
|
|
cache = this.__data__ = new MapCache(cache.__data__);
|
|
|
|
|
}
|
|
|
|
|
cache.set(key, value);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -617,53 +772,6 @@ Stack.prototype.get = stackGet;
|
|
|
|
|
Stack.prototype.has = stackHas;
|
|
|
|
|
Stack.prototype.set = stackSet;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Removes `key` and its value from the associative array.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Array} array The array to modify.
|
|
|
|
|
* @param {string} key The key of the value to remove.
|
|
|
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function assocDelete(array, key) {
|
|
|
|
|
var index = assocIndexOf(array, key);
|
|
|
|
|
if (index < 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
var lastIndex = array.length - 1;
|
|
|
|
|
if (index == lastIndex) {
|
|
|
|
|
array.pop();
|
|
|
|
|
} else {
|
|
|
|
|
splice.call(array, index, 1);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets the associative array value for `key`.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Array} array The array to query.
|
|
|
|
|
* @param {string} key The key of the value to get.
|
|
|
|
|
* @returns {*} Returns the entry value.
|
|
|
|
|
*/
|
|
|
|
|
function assocGet(array, key) {
|
|
|
|
|
var index = assocIndexOf(array, key);
|
|
|
|
|
return index < 0 ? undefined : array[index][1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Checks if an associative array value for `key` exists.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Array} array The array to query.
|
|
|
|
|
* @param {string} key The key of the entry to check.
|
|
|
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function assocHas(array, key) {
|
|
|
|
|
return assocIndexOf(array, key) > -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets the index at which the `key` is found in `array` of key-value pairs.
|
|
|
|
|
*
|
|
|
|
|
@@ -682,23 +790,6 @@ function assocIndexOf(array, key) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the associative array `key` to `value`.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Array} array The array to modify.
|
|
|
|
|
* @param {string} key The key of the value to set.
|
|
|
|
|
* @param {*} value The value to set.
|
|
|
|
|
*/
|
|
|
|
|
function assocSet(array, key, value) {
|
|
|
|
|
var index = assocIndexOf(array, key);
|
|
|
|
|
if (index < 0) {
|
|
|
|
|
array.push([key, value]);
|
|
|
|
|
} else {
|
|
|
|
|
array[index][1] = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The base implementation of `_.get` without support for default values.
|
|
|
|
|
*
|
|
|
|
|
@@ -714,7 +805,7 @@ function baseGet(object, path) {
|
|
|
|
|
length = path.length;
|
|
|
|
|
|
|
|
|
|
while (object != null && index < length) {
|
|
|
|
|
object = object[path[index++]];
|
|
|
|
|
object = object[toKey(path[index++])];
|
|
|
|
|
}
|
|
|
|
|
return (index && index == length) ? object : undefined;
|
|
|
|
|
}
|
|
|
|
|
@@ -925,7 +1016,7 @@ function baseKeys(object) {
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} source The object of property values to match.
|
|
|
|
|
* @returns {Function} Returns the new function.
|
|
|
|
|
* @returns {Function} Returns the new spec function.
|
|
|
|
|
*/
|
|
|
|
|
function baseMatches(source) {
|
|
|
|
|
var matchData = getMatchData(source);
|
|
|
|
|
@@ -943,11 +1034,11 @@ function baseMatches(source) {
|
|
|
|
|
* @private
|
|
|
|
|
* @param {string} path The path of the property to get.
|
|
|
|
|
* @param {*} srcValue The value to match.
|
|
|
|
|
* @returns {Function} Returns the new function.
|
|
|
|
|
* @returns {Function} Returns the new spec function.
|
|
|
|
|
*/
|
|
|
|
|
function baseMatchesProperty(path, srcValue) {
|
|
|
|
|
if (isKey(path) && isStrictComparable(srcValue)) {
|
|
|
|
|
return matchesStrictComparable(path, srcValue);
|
|
|
|
|
return matchesStrictComparable(toKey(path), srcValue);
|
|
|
|
|
}
|
|
|
|
|
return function(object) {
|
|
|
|
|
var objValue = get(object, path);
|
|
|
|
|
@@ -962,7 +1053,7 @@ function baseMatchesProperty(path, srcValue) {
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {string} key The key of the property to get.
|
|
|
|
|
* @returns {Function} Returns the new function.
|
|
|
|
|
* @returns {Function} Returns the new accessor function.
|
|
|
|
|
*/
|
|
|
|
|
function baseProperty(key) {
|
|
|
|
|
return function(object) {
|
|
|
|
|
@@ -975,7 +1066,7 @@ function baseProperty(key) {
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Array|string} path The path of the property to get.
|
|
|
|
|
* @returns {Function} Returns the new function.
|
|
|
|
|
* @returns {Function} Returns the new accessor function.
|
|
|
|
|
*/
|
|
|
|
|
function basePropertyDeep(path) {
|
|
|
|
|
return function(object) {
|
|
|
|
|
@@ -994,6 +1085,26 @@ function castPath(value) {
|
|
|
|
|
return isArray(value) ? value : stringToPath(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates a `_.toPairs` or `_.toPairsIn` function.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Function} keysFunc The function to get the keys of a given object.
|
|
|
|
|
* @returns {Function} Returns the new pairs function.
|
|
|
|
|
*/
|
|
|
|
|
function createToPairs(keysFunc) {
|
|
|
|
|
return function(object) {
|
|
|
|
|
var tag = getTag(object);
|
|
|
|
|
if (tag == mapTag) {
|
|
|
|
|
return mapToArray(object);
|
|
|
|
|
}
|
|
|
|
|
if (tag == setTag) {
|
|
|
|
|
return setToPairs(object);
|
|
|
|
|
}
|
|
|
|
|
return baseToPairs(object, keysFunc(object));
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* A specialized version of `baseIsEqualDeep` for arrays with support for
|
|
|
|
|
* partial deep comparisons.
|
|
|
|
|
@@ -1009,9 +1120,7 @@ function castPath(value) {
|
|
|
|
|
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
|
|
|
|
|
var index = -1,
|
|
|
|
|
isPartial = bitmask & PARTIAL_COMPARE_FLAG,
|
|
|
|
|
isUnordered = bitmask & UNORDERED_COMPARE_FLAG,
|
|
|
|
|
var isPartial = bitmask & PARTIAL_COMPARE_FLAG,
|
|
|
|
|
arrLength = array.length,
|
|
|
|
|
othLength = other.length;
|
|
|
|
|
|
|
|
|
|
@@ -1023,7 +1132,10 @@ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
|
|
|
|
|
if (stacked) {
|
|
|
|
|
return stacked == other;
|
|
|
|
|
}
|
|
|
|
|
var result = true;
|
|
|
|
|
var index = -1,
|
|
|
|
|
result = true,
|
|
|
|
|
seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;
|
|
|
|
|
|
|
|
|
|
stack.set(array, other);
|
|
|
|
|
|
|
|
|
|
// Ignore non-index properties.
|
|
|
|
|
@@ -1044,10 +1156,12 @@ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// Recursively compare arrays (susceptible to call stack limits).
|
|
|
|
|
if (isUnordered) {
|
|
|
|
|
if (!arraySome(other, function(othValue) {
|
|
|
|
|
return arrValue === othValue ||
|
|
|
|
|
equalFunc(arrValue, othValue, customizer, bitmask, stack);
|
|
|
|
|
if (seen) {
|
|
|
|
|
if (!arraySome(other, function(othValue, othIndex) {
|
|
|
|
|
if (!seen.has(othIndex) &&
|
|
|
|
|
(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {
|
|
|
|
|
return seen.add(othIndex);
|
|
|
|
|
}
|
|
|
|
|
})) {
|
|
|
|
|
result = false;
|
|
|
|
|
break;
|
|
|
|
|
@@ -1238,6 +1352,21 @@ function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {
|
|
|
|
|
*/
|
|
|
|
|
var getLength = baseProperty('length');
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets the data for `map`.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Object} map The map to query.
|
|
|
|
|
* @param {string} key The reference key.
|
|
|
|
|
* @returns {*} Returns the map data.
|
|
|
|
|
*/
|
|
|
|
|
function getMapData(map, key) {
|
|
|
|
|
var data = map.__data__;
|
|
|
|
|
return isKeyable(key)
|
|
|
|
|
? data[typeof key == 'string' ? 'string' : 'hash']
|
|
|
|
|
: data.map;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Gets the property names, values, and compare flags of `object`.
|
|
|
|
|
*
|
|
|
|
|
@@ -1332,7 +1461,7 @@ function hasPath(object, path, hasFunc) {
|
|
|
|
|
length = path.length;
|
|
|
|
|
|
|
|
|
|
while (++index < length) {
|
|
|
|
|
var key = path[index];
|
|
|
|
|
var key = toKey(path[index]);
|
|
|
|
|
if (!(result = object != null && hasFunc(object, key))) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
@@ -1363,6 +1492,21 @@ function indexKeys(object) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Checks if `value` is a valid array-like index.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {*} value The value to check.
|
|
|
|
|
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
|
|
|
|
|
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function isIndex(value, length) {
|
|
|
|
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|
|
|
|
return !!length &&
|
|
|
|
|
(typeof value == 'number' || reIsUint.test(value)) &&
|
|
|
|
|
(value > -1 && value % 1 == 0 && value < length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Checks if `value` is a property name and not a property path.
|
|
|
|
|
*
|
|
|
|
|
@@ -1372,13 +1516,16 @@ function indexKeys(object) {
|
|
|
|
|
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
|
|
|
|
|
*/
|
|
|
|
|
function isKey(value, object) {
|
|
|
|
|
if (isArray(value)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
var type = typeof value;
|
|
|
|
|
if (type == 'number' || type == 'symbol') {
|
|
|
|
|
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
|
|
|
|
|
value == null || isSymbol(value)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return !isArray(value) &&
|
|
|
|
|
(isSymbol(value) || reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
|
|
|
|
|
(object != null && value in Object(object)));
|
|
|
|
|
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
|
|
|
|
|
(object != null && value in Object(object));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -1390,8 +1537,9 @@ function isKey(value, object) {
|
|
|
|
|
*/
|
|
|
|
|
function isKeyable(value) {
|
|
|
|
|
var type = typeof value;
|
|
|
|
|
return type == 'number' || type == 'boolean' ||
|
|
|
|
|
(type == 'string' && value != '__proto__') || value == null;
|
|
|
|
|
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
|
|
|
|
|
? (value !== '__proto__')
|
|
|
|
|
: (value === null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -1427,7 +1575,7 @@ function isStrictComparable(value) {
|
|
|
|
|
* @private
|
|
|
|
|
* @param {string} key The key of the property to get.
|
|
|
|
|
* @param {*} srcValue The value to match.
|
|
|
|
|
* @returns {Function} Returns the new function.
|
|
|
|
|
* @returns {Function} Returns the new spec function.
|
|
|
|
|
*/
|
|
|
|
|
function matchesStrictComparable(key, srcValue) {
|
|
|
|
|
return function(object) {
|
|
|
|
|
@@ -1439,6 +1587,21 @@ function matchesStrictComparable(key, srcValue) {
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Converts `value` to a string key if it's not a string or symbol.
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {*} value The value to inspect.
|
|
|
|
|
* @returns {string|symbol} Returns the key.
|
|
|
|
|
*/
|
|
|
|
|
function toKey(value) {
|
|
|
|
|
if (typeof value == 'string' || isSymbol(value)) {
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
var result = (value + '');
|
|
|
|
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Converts `func` to its source code.
|
|
|
|
|
*
|
|
|
|
|
@@ -1924,7 +2087,8 @@ function keys(object) {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates an array of own enumerable string keyed-value pairs for `object`
|
|
|
|
|
* which can be consumed by `_.fromPairs`.
|
|
|
|
|
* which can be consumed by `_.fromPairs`. If `object` is a map or set, its
|
|
|
|
|
* entries are returned.
|
|
|
|
|
*
|
|
|
|
|
* @static
|
|
|
|
|
* @memberOf _
|
|
|
|
|
@@ -1932,7 +2096,7 @@ function keys(object) {
|
|
|
|
|
* @alias entries
|
|
|
|
|
* @category Object
|
|
|
|
|
* @param {Object} object The object to query.
|
|
|
|
|
* @returns {Array} Returns the new array of key-value pairs.
|
|
|
|
|
* @returns {Array} Returns the key-value pairs.
|
|
|
|
|
* @example
|
|
|
|
|
*
|
|
|
|
|
* function Foo() {
|
|
|
|
|
@@ -1945,9 +2109,7 @@ function keys(object) {
|
|
|
|
|
* _.toPairs(new Foo);
|
|
|
|
|
* // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
|
|
|
|
|
*/
|
|
|
|
|
function toPairs(object) {
|
|
|
|
|
return baseToPairs(object, keys(object));
|
|
|
|
|
}
|
|
|
|
|
var toPairs = createToPairs(keys);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This method returns the first argument given to it.
|
|
|
|
|
@@ -1977,7 +2139,7 @@ function identity(value) {
|
|
|
|
|
* @since 2.4.0
|
|
|
|
|
* @category Util
|
|
|
|
|
* @param {Array|string} path The path of the property to get.
|
|
|
|
|
* @returns {Function} Returns the new function.
|
|
|
|
|
* @returns {Function} Returns the new accessor function.
|
|
|
|
|
* @example
|
|
|
|
|
*
|
|
|
|
|
* var objects = [
|
|
|
|
|
@@ -1992,7 +2154,7 @@ function identity(value) {
|
|
|
|
|
* // => [1, 2]
|
|
|
|
|
*/
|
|
|
|
|
function property(path) {
|
|
|
|
|
return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
|
|
|
|
|
return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = baseIteratee;
|
|
|
|
|
|