mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-06 17:47:49 +00:00
Bump to v3.0.0.
This commit is contained in:
21
internal/LazyWrapper.js
Normal file
21
internal/LazyWrapper.js
Normal file
@@ -0,0 +1,21 @@
|
||||
/** Used as references for `-Infinity` and `Infinity`. */
|
||||
var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
|
||||
|
||||
/**
|
||||
* Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to wrap.
|
||||
*/
|
||||
function LazyWrapper(value) {
|
||||
this.actions = null;
|
||||
this.dir = 1;
|
||||
this.dropCount = 0;
|
||||
this.filtered = false;
|
||||
this.iteratees = null;
|
||||
this.takeCount = POSITIVE_INFINITY;
|
||||
this.views = null;
|
||||
this.wrapped = value;
|
||||
}
|
||||
|
||||
export default LazyWrapper;
|
||||
15
internal/LodashWrapper.js
Normal file
15
internal/LodashWrapper.js
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* The base constructor for creating `lodash` wrapper objects.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to wrap.
|
||||
* @param {boolean} [chainAll] Enable chaining for all wrapper methods.
|
||||
* @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.
|
||||
*/
|
||||
function LodashWrapper(value, chainAll, actions) {
|
||||
this.__actions__ = actions || [];
|
||||
this.__chain__ = !!chainAll;
|
||||
this.__wrapped__ = value;
|
||||
}
|
||||
|
||||
export default LodashWrapper;
|
||||
24
internal/MapCache.js
Normal file
24
internal/MapCache.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import mapDelete from './mapDelete';
|
||||
import mapGet from './mapGet';
|
||||
import mapHas from './mapHas';
|
||||
import mapSet from './mapSet';
|
||||
|
||||
/**
|
||||
* Creates a cache object to store key/value pairs.
|
||||
*
|
||||
* @private
|
||||
* @static
|
||||
* @name Cache
|
||||
* @memberOf _.memoize
|
||||
*/
|
||||
function MapCache() {
|
||||
this.__data__ = {};
|
||||
}
|
||||
|
||||
// Add functions to the `Map` cache.
|
||||
MapCache.prototype['delete'] = mapDelete;
|
||||
MapCache.prototype.get = mapGet;
|
||||
MapCache.prototype.has = mapHas;
|
||||
MapCache.prototype.set = mapSet;
|
||||
|
||||
export default MapCache;
|
||||
30
internal/SetCache.js
Normal file
30
internal/SetCache.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import cachePush from './cachePush';
|
||||
import isNative from '../lang/isNative';
|
||||
import root from './root';
|
||||
|
||||
/** Native method references. */
|
||||
var Set = isNative(Set = root.Set) && Set;
|
||||
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate;
|
||||
|
||||
/**
|
||||
*
|
||||
* Creates a cache object to store unique values.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} [values] The values to cache.
|
||||
*/
|
||||
function SetCache(values) {
|
||||
var length = values ? values.length : 0;
|
||||
|
||||
this.data = { 'hash': nativeCreate(null), 'set': new Set };
|
||||
while (length--) {
|
||||
this.push(values[length]);
|
||||
}
|
||||
}
|
||||
|
||||
// Add functions to the `Set` cache.
|
||||
SetCache.prototype.push = cachePush;
|
||||
|
||||
export default SetCache;
|
||||
20
internal/arrayCopy.js
Normal file
20
internal/arrayCopy.js
Normal file
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
* Copies the values of `source` to `array`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} source The array to copy values from.
|
||||
* @param {Array} [array=[]] The array to copy values to.
|
||||
* @returns {Array} Returns `array`.
|
||||
*/
|
||||
function arrayCopy(source, array) {
|
||||
var index = -1,
|
||||
length = source.length;
|
||||
|
||||
array || (array = Array(length));
|
||||
while (++index < length) {
|
||||
array[index] = source[index];
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
export default arrayCopy;
|
||||
22
internal/arrayEach.js
Normal file
22
internal/arrayEach.js
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* A specialized version of `_.forEach` for arrays without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array} Returns `array`.
|
||||
*/
|
||||
function arrayEach(array, iteratee) {
|
||||
var index = -1,
|
||||
length = array.length;
|
||||
|
||||
while (++index < length) {
|
||||
if (iteratee(array[index], index, array) === false) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
export default arrayEach;
|
||||
21
internal/arrayEachRight.js
Normal file
21
internal/arrayEachRight.js
Normal file
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* A specialized version of `_.forEachRight` for arrays without support for
|
||||
* callback shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array} Returns `array`.
|
||||
*/
|
||||
function arrayEachRight(array, iteratee) {
|
||||
var length = array.length;
|
||||
|
||||
while (length--) {
|
||||
if (iteratee(array[length], length, array) === false) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
export default arrayEachRight;
|
||||
23
internal/arrayEvery.js
Normal file
23
internal/arrayEvery.js
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* A specialized version of `_.every` for arrays without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||||
* else `false`.
|
||||
*/
|
||||
function arrayEvery(array, predicate) {
|
||||
var index = -1,
|
||||
length = array.length;
|
||||
|
||||
while (++index < length) {
|
||||
if (!predicate(array[index], index, array)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export default arrayEvery;
|
||||
25
internal/arrayFilter.js
Normal file
25
internal/arrayFilter.js
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* A specialized version of `_.filter` for arrays without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {Array} Returns the new filtered array.
|
||||
*/
|
||||
function arrayFilter(array, predicate) {
|
||||
var index = -1,
|
||||
length = array.length,
|
||||
resIndex = -1,
|
||||
result = [];
|
||||
|
||||
while (++index < length) {
|
||||
var value = array[index];
|
||||
if (predicate(value, index, array)) {
|
||||
result[++resIndex] = value;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default arrayFilter;
|
||||
21
internal/arrayMap.js
Normal file
21
internal/arrayMap.js
Normal file
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* A specialized version of `_.map` for arrays without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array} Returns the new mapped array.
|
||||
*/
|
||||
function arrayMap(array, iteratee) {
|
||||
var index = -1,
|
||||
length = array.length,
|
||||
result = Array(length);
|
||||
|
||||
while (++index < length) {
|
||||
result[index] = iteratee(array[index], index, array);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default arrayMap;
|
||||
25
internal/arrayMax.js
Normal file
25
internal/arrayMax.js
Normal file
@@ -0,0 +1,25 @@
|
||||
/** Used as references for `-Infinity` and `Infinity`. */
|
||||
var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY;
|
||||
|
||||
/**
|
||||
* A specialized version of `_.max` for arrays without support for iteratees.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @returns {*} Returns the maximum value.
|
||||
*/
|
||||
function arrayMax(array) {
|
||||
var index = -1,
|
||||
length = array.length,
|
||||
result = NEGATIVE_INFINITY;
|
||||
|
||||
while (++index < length) {
|
||||
var value = array[index];
|
||||
if (value > result) {
|
||||
result = value;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default arrayMax;
|
||||
25
internal/arrayMin.js
Normal file
25
internal/arrayMin.js
Normal file
@@ -0,0 +1,25 @@
|
||||
/** Used as references for `-Infinity` and `Infinity`. */
|
||||
var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
|
||||
|
||||
/**
|
||||
* A specialized version of `_.min` for arrays without support for iteratees.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @returns {*} Returns the minimum value.
|
||||
*/
|
||||
function arrayMin(array) {
|
||||
var index = -1,
|
||||
length = array.length,
|
||||
result = POSITIVE_INFINITY;
|
||||
|
||||
while (++index < length) {
|
||||
var value = array[index];
|
||||
if (value < result) {
|
||||
result = value;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default arrayMin;
|
||||
26
internal/arrayReduce.js
Normal file
26
internal/arrayReduce.js
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* A specialized version of `_.reduce` for arrays without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {*} [accumulator] The initial value.
|
||||
* @param {boolean} [initFromArray] Specify using the first element of `array`
|
||||
* as the initial value.
|
||||
* @returns {*} Returns the accumulated value.
|
||||
*/
|
||||
function arrayReduce(array, iteratee, accumulator, initFromArray) {
|
||||
var index = -1,
|
||||
length = array.length;
|
||||
|
||||
if (initFromArray && length) {
|
||||
accumulator = array[++index];
|
||||
}
|
||||
while (++index < length) {
|
||||
accumulator = iteratee(accumulator, array[index], index, array);
|
||||
}
|
||||
return accumulator;
|
||||
}
|
||||
|
||||
export default arrayReduce;
|
||||
24
internal/arrayReduceRight.js
Normal file
24
internal/arrayReduceRight.js
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* A specialized version of `_.reduceRight` for arrays without support for
|
||||
* callback shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {*} [accumulator] The initial value.
|
||||
* @param {boolean} [initFromArray] Specify using the last element of `array`
|
||||
* as the initial value.
|
||||
* @returns {*} Returns the accumulated value.
|
||||
*/
|
||||
function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
|
||||
var length = array.length;
|
||||
if (initFromArray && length) {
|
||||
accumulator = array[--length];
|
||||
}
|
||||
while (length--) {
|
||||
accumulator = iteratee(accumulator, array[length], length, array);
|
||||
}
|
||||
return accumulator;
|
||||
}
|
||||
|
||||
export default arrayReduceRight;
|
||||
23
internal/arraySome.js
Normal file
23
internal/arraySome.js
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* A specialized version of `_.some` for arrays without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
||||
* else `false`.
|
||||
*/
|
||||
function arraySome(array, predicate) {
|
||||
var index = -1,
|
||||
length = array.length;
|
||||
|
||||
while (++index < length) {
|
||||
if (predicate(array[index], index, array)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export default arraySome;
|
||||
13
internal/assignDefaults.js
Normal file
13
internal/assignDefaults.js
Normal file
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Used by `_.defaults` to customize its `_.assign` use.
|
||||
*
|
||||
* @private
|
||||
* @param {*} objectValue The destination object property value.
|
||||
* @param {*} sourceValue The source object property value.
|
||||
* @returns {*} Returns the value to assign to the destination object.
|
||||
*/
|
||||
function assignDefaults(objectValue, sourceValue) {
|
||||
return typeof objectValue == 'undefined' ? sourceValue : objectValue;
|
||||
}
|
||||
|
||||
export default assignDefaults;
|
||||
26
internal/assignOwnDefaults.js
Normal file
26
internal/assignOwnDefaults.js
Normal file
@@ -0,0 +1,26 @@
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* Used by `_.template` to customize its `_.assign` use.
|
||||
*
|
||||
* **Note:** This method is like `assignDefaults` except that it ignores
|
||||
* inherited property values when checking if a property is `undefined`.
|
||||
*
|
||||
* @private
|
||||
* @param {*} objectValue The destination object property value.
|
||||
* @param {*} sourceValue The source object property value.
|
||||
* @param {string} key The key associated with the object and source values.
|
||||
* @param {Object} object The destination object.
|
||||
* @returns {*} Returns the value to assign to the destination object.
|
||||
*/
|
||||
function assignOwnDefaults(objectValue, sourceValue, key, object) {
|
||||
return (typeof objectValue == 'undefined' || !hasOwnProperty.call(object, key))
|
||||
? sourceValue
|
||||
: objectValue;
|
||||
}
|
||||
|
||||
export default assignOwnDefaults;
|
||||
35
internal/baseAssign.js
Normal file
35
internal/baseAssign.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import baseCopy from './baseCopy';
|
||||
import keys from '../object/keys';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.assign` without support for argument juggling,
|
||||
* multiple sources, and `this` binding `customizer` functions.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The destination object.
|
||||
* @param {Object} source The source object.
|
||||
* @param {Function} [customizer] The function to customize assigning values.
|
||||
* @returns {Object} Returns the destination object.
|
||||
*/
|
||||
function baseAssign(object, source, customizer) {
|
||||
var props = keys(source);
|
||||
if (!customizer) {
|
||||
return baseCopy(source, object, props);
|
||||
}
|
||||
var index = -1,
|
||||
length = props.length
|
||||
|
||||
while (++index < length) {
|
||||
var key = props[index],
|
||||
value = object[key],
|
||||
result = customizer(value, source[key], key, object, source);
|
||||
|
||||
if ((result === result ? result !== value : value === value) ||
|
||||
(typeof value == 'undefined' && !(key in object))) {
|
||||
object[key] = result;
|
||||
}
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
export default baseAssign;
|
||||
32
internal/baseAt.js
Normal file
32
internal/baseAt.js
Normal file
@@ -0,0 +1,32 @@
|
||||
import isIndex from './isIndex';
|
||||
import isLength from './isLength';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.at` without support for strings and individual
|
||||
* key arguments.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {number[]|string[]} [props] The property names or indexes of elements to pick.
|
||||
* @returns {Array} Returns the new array of picked elements.
|
||||
*/
|
||||
function baseAt(collection, props) {
|
||||
var index = -1,
|
||||
length = collection.length,
|
||||
isArr = isLength(length),
|
||||
propsLength = props.length,
|
||||
result = Array(propsLength);
|
||||
|
||||
while(++index < propsLength) {
|
||||
var key = props[index];
|
||||
if (isArr) {
|
||||
key = parseFloat(key);
|
||||
result[index] = isIndex(key, length) ? collection[key] : undefined;
|
||||
} else {
|
||||
result[index] = collection[key];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseAt;
|
||||
26
internal/baseBindAll.js
Normal file
26
internal/baseBindAll.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import createWrapper from './createWrapper';
|
||||
|
||||
/** Used to compose bitmasks for wrapper metadata. */
|
||||
var BIND_FLAG = 1;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.bindAll` without support for individual
|
||||
* method name arguments.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to bind and assign the bound methods to.
|
||||
* @param {string[]} methodNames The object method names to bind.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseBindAll(object, methodNames) {
|
||||
var index = -1,
|
||||
length = methodNames.length;
|
||||
|
||||
while (++index < length) {
|
||||
var key = methodNames[index];
|
||||
object[key] = createWrapper(object[key], BIND_FLAG, object);
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
export default baseBindAll;
|
||||
34
internal/baseCallback.js
Normal file
34
internal/baseCallback.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import baseMatches from './baseMatches';
|
||||
import baseProperty from './baseProperty';
|
||||
import baseToString from './baseToString';
|
||||
import bindCallback from './bindCallback';
|
||||
import identity from '../utility/identity';
|
||||
import isBindable from './isBindable';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.callback` which supports specifying the
|
||||
* number of arguments to provide to `func`.
|
||||
*
|
||||
* @private
|
||||
* @param {*} [func=_.identity] The value to convert to a callback.
|
||||
* @param {*} [thisArg] The `this` binding of `func`.
|
||||
* @param {number} [argCount] The number of arguments to provide to `func`.
|
||||
* @returns {Function} Returns the callback.
|
||||
*/
|
||||
function baseCallback(func, thisArg, argCount) {
|
||||
var type = typeof func;
|
||||
if (type == 'function') {
|
||||
return (typeof thisArg != 'undefined' && isBindable(func))
|
||||
? bindCallback(func, thisArg, argCount)
|
||||
: func;
|
||||
}
|
||||
if (func == null) {
|
||||
return identity;
|
||||
}
|
||||
// Handle "_.property" and "_.matches" style callback shorthands.
|
||||
return type == 'object'
|
||||
? baseMatches(func, !argCount)
|
||||
: baseProperty(argCount ? baseToString(func) : func);
|
||||
}
|
||||
|
||||
export default baseCallback;
|
||||
130
internal/baseClone.js
Normal file
130
internal/baseClone.js
Normal file
@@ -0,0 +1,130 @@
|
||||
import arrayCopy from './arrayCopy';
|
||||
import arrayEach from './arrayEach';
|
||||
import baseCopy from './baseCopy';
|
||||
import baseForOwn from './baseForOwn';
|
||||
import initCloneArray from './initCloneArray';
|
||||
import initCloneByTag from './initCloneByTag';
|
||||
import initCloneObject from './initCloneObject';
|
||||
import isArray from '../lang/isArray';
|
||||
import isObject from '../lang/isObject';
|
||||
import keys from '../object/keys';
|
||||
|
||||
/** `Object#toString` result references. */
|
||||
var argsTag = '[object Arguments]',
|
||||
arrayTag = '[object Array]',
|
||||
boolTag = '[object Boolean]',
|
||||
dateTag = '[object Date]',
|
||||
errorTag = '[object Error]',
|
||||
funcTag = '[object Function]',
|
||||
mapTag = '[object Map]',
|
||||
numberTag = '[object Number]',
|
||||
objectTag = '[object Object]',
|
||||
regexpTag = '[object RegExp]',
|
||||
setTag = '[object Set]',
|
||||
stringTag = '[object String]',
|
||||
weakMapTag = '[object WeakMap]';
|
||||
|
||||
var arrayBufferTag = '[object ArrayBuffer]',
|
||||
float32Tag = '[object Float32Array]',
|
||||
float64Tag = '[object Float64Array]',
|
||||
int8Tag = '[object Int8Array]',
|
||||
int16Tag = '[object Int16Array]',
|
||||
int32Tag = '[object Int32Array]',
|
||||
uint8Tag = '[object Uint8Array]',
|
||||
uint8ClampedTag = '[object Uint8ClampedArray]',
|
||||
uint16Tag = '[object Uint16Array]',
|
||||
uint32Tag = '[object Uint32Array]';
|
||||
|
||||
/** Used to identify `toStringTag` values supported by `_.clone`. */
|
||||
var cloneableTags = {};
|
||||
cloneableTags[argsTag] = cloneableTags[arrayTag] =
|
||||
cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =
|
||||
cloneableTags[dateTag] = cloneableTags[float32Tag] =
|
||||
cloneableTags[float64Tag] = cloneableTags[int8Tag] =
|
||||
cloneableTags[int16Tag] = cloneableTags[int32Tag] =
|
||||
cloneableTags[numberTag] = cloneableTags[objectTag] =
|
||||
cloneableTags[regexpTag] = cloneableTags[stringTag] =
|
||||
cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
|
||||
cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
|
||||
cloneableTags[errorTag] = cloneableTags[funcTag] =
|
||||
cloneableTags[mapTag] = cloneableTags[setTag] =
|
||||
cloneableTags[weakMapTag] = false;
|
||||
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/**
|
||||
* Used to resolve the `toStringTag` of values.
|
||||
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
|
||||
* for more details.
|
||||
*/
|
||||
var objToString = objectProto.toString;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.clone` without support for argument juggling
|
||||
* and `this` binding `customizer` functions.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to clone.
|
||||
* @param {boolean} [isDeep] Specify a deep clone.
|
||||
* @param {Function} [customizer] The function to customize cloning values.
|
||||
* @param {string} [key] The key of `value`.
|
||||
* @param {Object} [object] The object `value` belongs to.
|
||||
* @param {Array} [stackA=[]] Tracks traversed source objects.
|
||||
* @param {Array} [stackB=[]] Associates clones with source counterparts.
|
||||
* @returns {*} Returns the cloned value.
|
||||
*/
|
||||
function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
|
||||
var result;
|
||||
if (customizer) {
|
||||
result = object ? customizer(value, key, object) : customizer(value);
|
||||
}
|
||||
if (typeof result != 'undefined') {
|
||||
return result;
|
||||
}
|
||||
if (!isObject(value)) {
|
||||
return value;
|
||||
}
|
||||
var isArr = isArray(value);
|
||||
if (isArr) {
|
||||
result = initCloneArray(value);
|
||||
if (!isDeep) {
|
||||
return arrayCopy(value, result);
|
||||
}
|
||||
} else {
|
||||
var tag = objToString.call(value),
|
||||
isFunc = tag == funcTag;
|
||||
|
||||
if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
|
||||
result = initCloneObject(isFunc ? {} : value);
|
||||
if (!isDeep) {
|
||||
return baseCopy(value, result, keys(value));
|
||||
}
|
||||
} else {
|
||||
return cloneableTags[tag]
|
||||
? initCloneByTag(value, tag, isDeep)
|
||||
: (object ? value : {});
|
||||
}
|
||||
}
|
||||
// Check for circular references and return corresponding clone.
|
||||
stackA || (stackA = []);
|
||||
stackB || (stackB = []);
|
||||
|
||||
var length = stackA.length;
|
||||
while (length--) {
|
||||
if (stackA[length] == value) {
|
||||
return stackB[length];
|
||||
}
|
||||
}
|
||||
// Add the source value to the stack of traversed objects and associate it with its clone.
|
||||
stackA.push(value);
|
||||
stackB.push(result);
|
||||
|
||||
// Recursively populate clone (susceptible to call stack limits).
|
||||
(isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {
|
||||
result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseClone;
|
||||
25
internal/baseCompareAscending.js
Normal file
25
internal/baseCompareAscending.js
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* The base implementation of `compareAscending` which compares values and
|
||||
* sorts them in ascending order without guaranteeing a stable sort.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to compare to `other`.
|
||||
* @param {*} other The value to compare to `value`.
|
||||
* @returns {number} Returns the sort order indicator for `value`.
|
||||
*/
|
||||
function baseCompareAscending(value, other) {
|
||||
if (value !== other) {
|
||||
var valIsReflexive = value === value,
|
||||
othIsReflexive = other === other;
|
||||
|
||||
if (value > other || !valIsReflexive || (typeof value == 'undefined' && othIsReflexive)) {
|
||||
return 1;
|
||||
}
|
||||
if (value < other || !othIsReflexive || (typeof other == 'undefined' && valIsReflexive)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
export default baseCompareAscending;
|
||||
25
internal/baseCopy.js
Normal file
25
internal/baseCopy.js
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Copies the properties of `source` to `object`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} source The object to copy properties from.
|
||||
* @param {Object} [object={}] The object to copy properties to.
|
||||
* @param {Array} props The property names to copy.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseCopy(source, object, props) {
|
||||
if (!props) {
|
||||
props = object;
|
||||
object = {};
|
||||
}
|
||||
var index = -1,
|
||||
length = props.length;
|
||||
|
||||
while (++index < length) {
|
||||
var key = props[index];
|
||||
object[key] = source[key];
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
export default baseCopy;
|
||||
24
internal/baseCreate.js
Normal file
24
internal/baseCreate.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import isObject from '../lang/isObject';
|
||||
import root from './root';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.create` without support for assigning
|
||||
* properties to the created object.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} prototype The object to inherit from.
|
||||
* @returns {Object} Returns the new object.
|
||||
*/
|
||||
var baseCreate = (function() {
|
||||
function Object() {}
|
||||
return function(prototype) {
|
||||
if (isObject(prototype)) {
|
||||
Object.prototype = prototype;
|
||||
var result = new Object;
|
||||
Object.prototype = null;
|
||||
}
|
||||
return result || root.Object();
|
||||
};
|
||||
}());
|
||||
|
||||
export default baseCreate;
|
||||
24
internal/baseDelay.js
Normal file
24
internal/baseDelay.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import baseSlice from './baseSlice';
|
||||
import isFunction from '../lang/isFunction';
|
||||
|
||||
/** Used as the `TypeError` message for "Functions" methods. */
|
||||
var FUNC_ERROR_TEXT = 'Expected a function';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.delay` and `_.defer` which accepts an index
|
||||
* of where to slice the arguments to provide to `func`.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to delay.
|
||||
* @param {number} wait The number of milliseconds to delay invocation.
|
||||
* @param {Object} args The `arguments` object to slice and provide to `func`.
|
||||
* @returns {number} Returns the timer id.
|
||||
*/
|
||||
function baseDelay(func, wait, args, fromIndex) {
|
||||
if (!isFunction(func)) {
|
||||
throw new TypeError(FUNC_ERROR_TEXT);
|
||||
}
|
||||
return setTimeout(function() { func.apply(undefined, baseSlice(args, fromIndex)); }, wait);
|
||||
}
|
||||
|
||||
export default baseDelay;
|
||||
52
internal/baseDifference.js
Normal file
52
internal/baseDifference.js
Normal file
@@ -0,0 +1,52 @@
|
||||
import baseIndexOf from './baseIndexOf';
|
||||
import cacheIndexOf from './cacheIndexOf';
|
||||
import createCache from './createCache';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.difference` which accepts a single array
|
||||
* of values to exclude.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to inspect.
|
||||
* @param {Array} values The values to exclude.
|
||||
* @returns {Array} Returns the new array of filtered values.
|
||||
*/
|
||||
function baseDifference(array, values) {
|
||||
var length = array ? array.length : 0,
|
||||
result = [];
|
||||
|
||||
if (!length) {
|
||||
return result;
|
||||
}
|
||||
var index = -1,
|
||||
indexOf = baseIndexOf,
|
||||
isCommon = true,
|
||||
cache = isCommon && values.length >= 200 && createCache(values),
|
||||
valuesLength = values.length;
|
||||
|
||||
if (cache) {
|
||||
indexOf = cacheIndexOf;
|
||||
isCommon = false;
|
||||
values = cache;
|
||||
}
|
||||
outer:
|
||||
while (++index < length) {
|
||||
var value = array[index];
|
||||
|
||||
if (isCommon && value === value) {
|
||||
var valuesIndex = valuesLength;
|
||||
while (valuesIndex--) {
|
||||
if (values[valuesIndex] === value) {
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
result.push(value);
|
||||
}
|
||||
else if (indexOf(values, value) < 0) {
|
||||
result.push(value);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseDifference;
|
||||
30
internal/baseEach.js
Normal file
30
internal/baseEach.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import baseForOwn from './baseForOwn';
|
||||
import isLength from './isLength';
|
||||
import toObject from './toObject';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forEach` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array|Object|string} Returns `collection`.
|
||||
*/
|
||||
function baseEach(collection, iteratee) {
|
||||
var length = collection ? collection.length : 0;
|
||||
if (!isLength(length)) {
|
||||
return baseForOwn(collection, iteratee);
|
||||
}
|
||||
var index = -1,
|
||||
iterable = toObject(collection);
|
||||
|
||||
while (++index < length) {
|
||||
if (iteratee(iterable[index], index, iterable) === false) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
|
||||
export default baseEach;
|
||||
28
internal/baseEachRight.js
Normal file
28
internal/baseEachRight.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import baseForOwnRight from './baseForOwnRight';
|
||||
import isLength from './isLength';
|
||||
import toObject from './toObject';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forEachRight` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array|Object|string} Returns `collection`.
|
||||
*/
|
||||
function baseEachRight(collection, iteratee) {
|
||||
var length = collection ? collection.length : 0;
|
||||
if (!isLength(length)) {
|
||||
return baseForOwnRight(collection, iteratee);
|
||||
}
|
||||
var iterable = toObject(collection);
|
||||
while (length--) {
|
||||
if (iteratee(iterable[length], length, iterable) === false) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
|
||||
export default baseEachRight;
|
||||
22
internal/baseEvery.js
Normal file
22
internal/baseEvery.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.every` without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||||
* else `false`
|
||||
*/
|
||||
function baseEvery(collection, predicate) {
|
||||
var result = true;
|
||||
baseEach(collection, function(value, index, collection) {
|
||||
result = !!predicate(value, index, collection);
|
||||
return result;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseEvery;
|
||||
22
internal/baseFilter.js
Normal file
22
internal/baseFilter.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.filter` without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {Array} Returns the new filtered array.
|
||||
*/
|
||||
function baseFilter(collection, predicate) {
|
||||
var result = [];
|
||||
baseEach(collection, function(value, index, collection) {
|
||||
if (predicate(value, index, collection)) {
|
||||
result.push(value);
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseFilter;
|
||||
25
internal/baseFind.js
Normal file
25
internal/baseFind.js
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,
|
||||
* without support for callback shorthands and `this` binding, which iterates
|
||||
* over `collection` using the provided `eachFunc`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to search.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @param {Function} eachFunc The function to iterate over `collection`.
|
||||
* @param {boolean} [retKey] Specify returning the key of the found element
|
||||
* instead of the element itself.
|
||||
* @returns {*} Returns the found element or its key, else `undefined`.
|
||||
*/
|
||||
function baseFind(collection, predicate, eachFunc, retKey) {
|
||||
var result;
|
||||
eachFunc(collection, function(value, key, collection) {
|
||||
if (predicate(value, key, collection)) {
|
||||
result = retKey ? key : value;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseFind;
|
||||
45
internal/baseFlatten.js
Normal file
45
internal/baseFlatten.js
Normal file
@@ -0,0 +1,45 @@
|
||||
import isArguments from '../lang/isArguments';
|
||||
import isArray from '../lang/isArray';
|
||||
import isLength from './isLength';
|
||||
import isObjectLike from './isObjectLike';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.flatten` with added support for restricting
|
||||
* flattening and specifying the start index.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to flatten.
|
||||
* @param {boolean} [isDeep] Specify a deep flatten.
|
||||
* @param {boolean} [isStrict] Restrict flattening to arrays and `arguments` objects.
|
||||
* @param {number} [fromIndex=0] The index to start from.
|
||||
* @returns {Array} Returns the new flattened array.
|
||||
*/
|
||||
function baseFlatten(array, isDeep, isStrict, fromIndex) {
|
||||
var index = (fromIndex || 0) - 1,
|
||||
length = array.length,
|
||||
resIndex = -1,
|
||||
result = [];
|
||||
|
||||
while (++index < length) {
|
||||
var value = array[index];
|
||||
|
||||
if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {
|
||||
if (isDeep) {
|
||||
// Recursively flatten arrays (susceptible to call stack limits).
|
||||
value = baseFlatten(value, isDeep, isStrict);
|
||||
}
|
||||
var valIndex = -1,
|
||||
valLength = value.length;
|
||||
|
||||
result.length += valLength;
|
||||
while (++valIndex < valLength) {
|
||||
result[++resIndex] = value[valIndex];
|
||||
}
|
||||
} else if (!isStrict) {
|
||||
result[++resIndex] = value;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseFlatten;
|
||||
30
internal/baseFor.js
Normal file
30
internal/baseFor.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import toObject from './toObject';
|
||||
|
||||
/**
|
||||
* The base implementation of `baseForIn` and `baseForOwn` which iterates
|
||||
* over `object` properties returned by `keysFunc` invoking `iteratee` for
|
||||
* each property. Iterator functions may exit iteration early by explicitly
|
||||
* returning `false`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {Function} keysFunc The function to get the keys of `object`.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseFor(object, iteratee, keysFunc) {
|
||||
var index = -1,
|
||||
iterable = toObject(object),
|
||||
props = keysFunc(object),
|
||||
length = props.length;
|
||||
|
||||
while (++index < length) {
|
||||
var key = props[index];
|
||||
if (iteratee(iterable[key], key, iterable) === false) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
export default baseFor;
|
||||
17
internal/baseForIn.js
Normal file
17
internal/baseForIn.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import baseFor from './baseFor';
|
||||
import keysIn from '../object/keysIn';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forIn` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseForIn(object, iteratee) {
|
||||
return baseFor(object, iteratee, keysIn);
|
||||
}
|
||||
|
||||
export default baseForIn;
|
||||
17
internal/baseForOwn.js
Normal file
17
internal/baseForOwn.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import baseFor from './baseFor';
|
||||
import keys from '../object/keys';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forOwn` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseForOwn(object, iteratee) {
|
||||
return baseFor(object, iteratee, keys);
|
||||
}
|
||||
|
||||
export default baseForOwn;
|
||||
17
internal/baseForOwnRight.js
Normal file
17
internal/baseForOwnRight.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import baseForRight from './baseForRight';
|
||||
import keys from '../object/keys';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forOwnRight` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseForOwnRight(object, iteratee) {
|
||||
return baseForRight(object, iteratee, keys);
|
||||
}
|
||||
|
||||
export default baseForOwnRight;
|
||||
27
internal/baseForRight.js
Normal file
27
internal/baseForRight.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import toObject from './toObject';
|
||||
|
||||
/**
|
||||
* This function is like `baseFor` except that it iterates over properties
|
||||
* in the opposite order.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {Function} keysFunc The function to get the keys of `object`.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseForRight(object, iteratee, keysFunc) {
|
||||
var iterable = toObject(object),
|
||||
props = keysFunc(object),
|
||||
length = props.length;
|
||||
|
||||
while (length--) {
|
||||
var key = props[length];
|
||||
if (iteratee(iterable[key], key, iterable) === false) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
export default baseForRight;
|
||||
27
internal/baseFunctions.js
Normal file
27
internal/baseFunctions.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import isFunction from '../lang/isFunction';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.functions` which creates an array of
|
||||
* `object` function property names filtered from those provided.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to inspect.
|
||||
* @param {Array} props The property names to filter.
|
||||
* @returns {Array} Returns the new array of filtered property names.
|
||||
*/
|
||||
function baseFunctions(object, props) {
|
||||
var index = -1,
|
||||
length = props.length,
|
||||
resIndex = -1,
|
||||
result = [];
|
||||
|
||||
while (++index < length) {
|
||||
var key = props[index];
|
||||
if (isFunction(object[key])) {
|
||||
result[++resIndex] = key;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseFunctions;
|
||||
27
internal/baseIndexOf.js
Normal file
27
internal/baseIndexOf.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import indexOfNaN from './indexOfNaN';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.indexOf` without support for binary searches.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to search.
|
||||
* @param {*} value The value to search for.
|
||||
* @param {number} [fromIndex=0] The index to search from.
|
||||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||||
*/
|
||||
function baseIndexOf(array, value, fromIndex) {
|
||||
if (value !== value) {
|
||||
return indexOfNaN(array, fromIndex);
|
||||
}
|
||||
var index = (fromIndex || 0) - 1,
|
||||
length = array.length;
|
||||
|
||||
while (++index < length) {
|
||||
if (array[index] === value) {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
export default baseIndexOf;
|
||||
28
internal/baseInvoke.js
Normal file
28
internal/baseInvoke.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import baseEach from './baseEach';
|
||||
import isLength from './isLength';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.invoke` which requires additional arguments
|
||||
* to be provided as an array of arguments rather than individually.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function|string} methodName The name of the method to invoke or
|
||||
* the function invoked per iteration.
|
||||
* @param {Array} [args] The arguments to invoke the method with.
|
||||
* @returns {Array} Returns the array of results.
|
||||
*/
|
||||
function baseInvoke(collection, methodName, args) {
|
||||
var index = -1,
|
||||
isFunc = typeof methodName == 'function',
|
||||
length = collection ? collection.length : 0,
|
||||
result = isLength(length) ? Array(length) : [];
|
||||
|
||||
baseEach(collection, function(value) {
|
||||
var func = isFunc ? methodName : (value != null && value[methodName]);
|
||||
result[++index] = func ? func.apply(value, args) : undefined;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseInvoke;
|
||||
34
internal/baseIsEqual.js
Normal file
34
internal/baseIsEqual.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import baseIsEqualDeep from './baseIsEqualDeep';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.isEqual` without support for `this` binding
|
||||
* `customizer` functions.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to compare.
|
||||
* @param {*} other The other value to compare.
|
||||
* @param {Function} [customizer] The function to customize comparing values.
|
||||
* @param {boolean} [isWhere] Specify performing partial comparisons.
|
||||
* @param {Array} [stackA] Tracks traversed `value` objects.
|
||||
* @param {Array} [stackB] Tracks traversed `other` objects.
|
||||
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
||||
*/
|
||||
function baseIsEqual(value, other, customizer, isWhere, stackA, stackB) {
|
||||
// Exit early for identical values.
|
||||
if (value === other) {
|
||||
// Treat `+0` vs. `-0` as not equal.
|
||||
return value !== 0 || (1 / value == 1 / other);
|
||||
}
|
||||
var valType = typeof value,
|
||||
othType = typeof other;
|
||||
|
||||
// Exit early for unlike primitive values.
|
||||
if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') ||
|
||||
value == null || other == null) {
|
||||
// Return `false` unless both values are `NaN`.
|
||||
return value !== value && other !== other;
|
||||
}
|
||||
return baseIsEqualDeep(value, other, baseIsEqual, customizer, isWhere, stackA, stackB);
|
||||
}
|
||||
|
||||
export default baseIsEqual;
|
||||
101
internal/baseIsEqualDeep.js
Normal file
101
internal/baseIsEqualDeep.js
Normal file
@@ -0,0 +1,101 @@
|
||||
import equalArrays from './equalArrays';
|
||||
import equalByTag from './equalByTag';
|
||||
import equalObjects from './equalObjects';
|
||||
import isArray from '../lang/isArray';
|
||||
import isTypedArray from '../lang/isTypedArray';
|
||||
|
||||
/** `Object#toString` result references. */
|
||||
var argsTag = '[object Arguments]',
|
||||
arrayTag = '[object Array]',
|
||||
objectTag = '[object Object]';
|
||||
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* Used to resolve the `toStringTag` of values.
|
||||
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
|
||||
* for more details.
|
||||
*/
|
||||
var objToString = objectProto.toString;
|
||||
|
||||
/**
|
||||
* A specialized version of `baseIsEqual` for arrays and objects which performs
|
||||
* deep comparisons and tracks traversed objects enabling objects with circular
|
||||
* references to be compared.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to compare.
|
||||
* @param {Object} other The other object to compare.
|
||||
* @param {Function} equalFunc The function to determine equivalents of values.
|
||||
* @param {Function} [customizer] The function to customize comparing objects.
|
||||
* @param {boolean} [isWhere] Specify performing partial comparisons.
|
||||
* @param {Array} [stackA=[]] Tracks traversed `value` objects.
|
||||
* @param {Array} [stackB=[]] Tracks traversed `other` objects.
|
||||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||||
*/
|
||||
function baseIsEqualDeep(object, other, equalFunc, customizer, isWhere, stackA, stackB) {
|
||||
var objIsArr = isArray(object),
|
||||
othIsArr = isArray(other),
|
||||
objTag = arrayTag,
|
||||
othTag = arrayTag;
|
||||
|
||||
if (!objIsArr) {
|
||||
objTag = objToString.call(object);
|
||||
if (objTag == argsTag) {
|
||||
objTag = objectTag;
|
||||
} else if (objTag != objectTag) {
|
||||
objIsArr = isTypedArray(object);
|
||||
}
|
||||
}
|
||||
if (!othIsArr) {
|
||||
othTag = objToString.call(other);
|
||||
if (othTag == argsTag) {
|
||||
othTag = objectTag;
|
||||
} else if (othTag != objectTag) {
|
||||
othIsArr = isTypedArray(other);
|
||||
}
|
||||
}
|
||||
var objIsObj = objTag == objectTag,
|
||||
othIsObj = othTag == objectTag,
|
||||
isSameTag = objTag == othTag;
|
||||
|
||||
if (isSameTag && !(objIsArr || objIsObj)) {
|
||||
return equalByTag(object, other, objTag);
|
||||
}
|
||||
var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
|
||||
othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
|
||||
|
||||
if (valWrapped || othWrapped) {
|
||||
return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isWhere, stackA, stackB);
|
||||
}
|
||||
if (!isSameTag) {
|
||||
return false;
|
||||
}
|
||||
// Assume cyclic values are equal.
|
||||
// For more information on detecting circular references see https://es5.github.io/#JO.
|
||||
stackA || (stackA = []);
|
||||
stackB || (stackB = []);
|
||||
|
||||
var length = stackA.length;
|
||||
while (length--) {
|
||||
if (stackA[length] == object) {
|
||||
return stackB[length] == other;
|
||||
}
|
||||
}
|
||||
// Add `object` and `other` to the stack of traversed objects.
|
||||
stackA.push(object);
|
||||
stackB.push(other);
|
||||
|
||||
var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isWhere, stackA, stackB);
|
||||
|
||||
stackA.pop();
|
||||
stackB.pop();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseIsEqualDeep;
|
||||
58
internal/baseIsMatch.js
Normal file
58
internal/baseIsMatch.js
Normal file
@@ -0,0 +1,58 @@
|
||||
import baseIsEqual from './baseIsEqual';
|
||||
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.isMatch` without support for callback
|
||||
* shorthands or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} source The object to inspect.
|
||||
* @param {Array} props The source property names to match.
|
||||
* @param {Array} values The source values to match.
|
||||
* @param {Array} strictCompareFlags Strict comparison flags for source values.
|
||||
* @param {Function} [customizer] The function to customize comparing objects.
|
||||
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
|
||||
*/
|
||||
function baseIsMatch(object, props, values, strictCompareFlags, customizer) {
|
||||
var length = props.length;
|
||||
if (object == null) {
|
||||
return !length;
|
||||
}
|
||||
var index = -1,
|
||||
noCustomizer = !customizer;
|
||||
|
||||
while (++index < length) {
|
||||
if ((noCustomizer && strictCompareFlags[index])
|
||||
? values[index] !== object[props[index]]
|
||||
: !hasOwnProperty.call(object, props[index])
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
index = -1;
|
||||
while (++index < length) {
|
||||
var key = props[index];
|
||||
if (noCustomizer && strictCompareFlags[index]) {
|
||||
var result = hasOwnProperty.call(object, key);
|
||||
} else {
|
||||
var objValue = object[key],
|
||||
srcValue = values[index];
|
||||
|
||||
result = customizer ? customizer(objValue, srcValue, key) : undefined;
|
||||
if (typeof result == 'undefined') {
|
||||
result = baseIsEqual(srcValue, objValue, customizer, true);
|
||||
}
|
||||
}
|
||||
if (!result) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export default baseIsMatch;
|
||||
20
internal/baseMap.js
Normal file
20
internal/baseMap.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.map` without support for callback shorthands
|
||||
* or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array} Returns the new mapped array.
|
||||
*/
|
||||
function baseMap(collection, iteratee) {
|
||||
var result = [];
|
||||
baseEach(collection, function(value, key, collection) {
|
||||
result.push(iteratee(value, key, collection));
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseMap;
|
||||
51
internal/baseMatches.js
Normal file
51
internal/baseMatches.js
Normal file
@@ -0,0 +1,51 @@
|
||||
import baseClone from './baseClone';
|
||||
import baseIsMatch from './baseIsMatch';
|
||||
import isStrictComparable from './isStrictComparable';
|
||||
import keys from '../object/keys';
|
||||
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.matches` which supports specifying whether
|
||||
* `source` should be cloned.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} source The object of property values to match.
|
||||
* @param {boolean} [isCloned] Specify cloning the source object.
|
||||
* @returns {Function} Returns the new function.
|
||||
*/
|
||||
function baseMatches(source, isCloned) {
|
||||
var props = keys(source),
|
||||
length = props.length;
|
||||
|
||||
if (length == 1) {
|
||||
var key = props[0],
|
||||
value = source[key];
|
||||
|
||||
if (isStrictComparable(value)) {
|
||||
return function(object) {
|
||||
return object != null && value === object[key] && hasOwnProperty.call(object, key);
|
||||
};
|
||||
}
|
||||
}
|
||||
if (isCloned) {
|
||||
source = baseClone(source, true);
|
||||
}
|
||||
var values = Array(length),
|
||||
strictCompareFlags = Array(length);
|
||||
|
||||
while (length--) {
|
||||
value = source[props[length]];
|
||||
values[length] = value;
|
||||
strictCompareFlags[length] = isStrictComparable(value);
|
||||
}
|
||||
return function(object) {
|
||||
return baseIsMatch(object, props, values, strictCompareFlags);
|
||||
};
|
||||
}
|
||||
|
||||
export default baseMatches;
|
||||
45
internal/baseMerge.js
Normal file
45
internal/baseMerge.js
Normal file
@@ -0,0 +1,45 @@
|
||||
import arrayEach from './arrayEach';
|
||||
import baseForOwn from './baseForOwn';
|
||||
import baseMergeDeep from './baseMergeDeep';
|
||||
import isArray from '../lang/isArray';
|
||||
import isLength from './isLength';
|
||||
import isObjectLike from './isObjectLike';
|
||||
import isTypedArray from '../lang/isTypedArray';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.merge` without support for argument juggling,
|
||||
* multiple sources, and `this` binding `customizer` functions.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The destination object.
|
||||
* @param {Object} source The source object.
|
||||
* @param {Function} [customizer] The function to customize merging properties.
|
||||
* @param {Array} [stackA=[]] Tracks traversed source objects.
|
||||
* @param {Array} [stackB=[]] Associates values with source counterparts.
|
||||
* @returns {Object} Returns the destination object.
|
||||
*/
|
||||
function baseMerge(object, source, customizer, stackA, stackB) {
|
||||
var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));
|
||||
|
||||
(isSrcArr ? arrayEach : baseForOwn)(source, function(srcValue, key, source) {
|
||||
if (isObjectLike(srcValue)) {
|
||||
stackA || (stackA = []);
|
||||
stackB || (stackB = []);
|
||||
return baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
|
||||
}
|
||||
var value = object[key],
|
||||
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
|
||||
isCommon = typeof result == 'undefined';
|
||||
|
||||
if (isCommon) {
|
||||
result = srcValue;
|
||||
}
|
||||
if ((isSrcArr || typeof result != 'undefined') &&
|
||||
(isCommon || (result === result ? result !== value : value === value))) {
|
||||
object[key] = result;
|
||||
}
|
||||
});
|
||||
return object;
|
||||
}
|
||||
|
||||
export default baseMerge;
|
||||
64
internal/baseMergeDeep.js
Normal file
64
internal/baseMergeDeep.js
Normal file
@@ -0,0 +1,64 @@
|
||||
import arrayCopy from './arrayCopy';
|
||||
import isArguments from '../lang/isArguments';
|
||||
import isArray from '../lang/isArray';
|
||||
import isLength from './isLength';
|
||||
import isPlainObject from '../lang/isPlainObject';
|
||||
import isTypedArray from '../lang/isTypedArray';
|
||||
import toPlainObject from '../lang/toPlainObject';
|
||||
|
||||
/**
|
||||
* A specialized version of `baseMerge` for arrays and objects which performs
|
||||
* deep merges and tracks traversed objects enabling objects with circular
|
||||
* references to be merged.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The destination object.
|
||||
* @param {Object} source The source object.
|
||||
* @param {string} key The key of the value to merge.
|
||||
* @param {Function} mergeFunc The function to merge values.
|
||||
* @param {Function} [customizer] The function to customize merging properties.
|
||||
* @param {Array} [stackA=[]] Tracks traversed source objects.
|
||||
* @param {Array} [stackB=[]] Associates values with source counterparts.
|
||||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||||
*/
|
||||
function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
|
||||
var length = stackA.length,
|
||||
srcValue = source[key];
|
||||
|
||||
while (length--) {
|
||||
if (stackA[length] == srcValue) {
|
||||
object[key] = stackB[length];
|
||||
return;
|
||||
}
|
||||
}
|
||||
var value = object[key],
|
||||
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
|
||||
isCommon = typeof result == 'undefined';
|
||||
|
||||
if (isCommon) {
|
||||
result = srcValue;
|
||||
if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {
|
||||
result = isArray(value)
|
||||
? value
|
||||
: (value ? arrayCopy(value) : []);
|
||||
}
|
||||
else if (isPlainObject(srcValue) || isArguments(srcValue)) {
|
||||
result = isArguments(value)
|
||||
? toPlainObject(value)
|
||||
: (isPlainObject(value) ? value : {});
|
||||
}
|
||||
}
|
||||
// Add the source value to the stack of traversed objects and associate
|
||||
// it with its merged value.
|
||||
stackA.push(srcValue);
|
||||
stackB.push(result);
|
||||
|
||||
if (isCommon) {
|
||||
// Recursively merge objects and arrays (susceptible to call stack limits).
|
||||
object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
|
||||
} else if (result === result ? result !== value : value === value) {
|
||||
object[key] = result;
|
||||
}
|
||||
}
|
||||
|
||||
export default baseMergeDeep;
|
||||
14
internal/baseProperty.js
Normal file
14
internal/baseProperty.js
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* The base implementation of `_.property` which does not coerce `key` to a string.
|
||||
*
|
||||
* @private
|
||||
* @param {string} key The key of the property to get.
|
||||
* @returns {Function} Returns the new function.
|
||||
*/
|
||||
function baseProperty(key) {
|
||||
return function(object) {
|
||||
return object == null ? undefined : object[key];
|
||||
};
|
||||
}
|
||||
|
||||
export default baseProperty;
|
||||
35
internal/basePullAt.js
Normal file
35
internal/basePullAt.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import baseAt from './baseAt';
|
||||
import baseCompareAscending from './baseCompareAscending';
|
||||
import isIndex from './isIndex';
|
||||
|
||||
/** Used for native method references. */
|
||||
var arrayProto = Array.prototype;
|
||||
|
||||
/** Native method references. */
|
||||
var splice = arrayProto.splice;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.pullAt` without support for individual
|
||||
* index arguments.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to modify.
|
||||
* @param {number[]} indexes The indexes of elements to remove.
|
||||
* @returns {Array} Returns the new array of removed elements.
|
||||
*/
|
||||
function basePullAt(array, indexes) {
|
||||
var length = indexes.length,
|
||||
result = baseAt(array, indexes);
|
||||
|
||||
indexes.sort(baseCompareAscending);
|
||||
while (length--) {
|
||||
var index = parseFloat(indexes[length]);
|
||||
if (index != previous && isIndex(index)) {
|
||||
var previous = index;
|
||||
splice.call(array, index, 1);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default basePullAt;
|
||||
20
internal/baseRandom.js
Normal file
20
internal/baseRandom.js
Normal file
@@ -0,0 +1,20 @@
|
||||
/** Native method references. */
|
||||
var floor = Math.floor;
|
||||
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeRandom = Math.random;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.random` without support for argument juggling
|
||||
* and returning floating-point numbers.
|
||||
*
|
||||
* @private
|
||||
* @param {number} min The minimum possible value.
|
||||
* @param {number} max The maximum possible value.
|
||||
* @returns {number} Returns the random number.
|
||||
*/
|
||||
function baseRandom(min, max) {
|
||||
return min + floor(nativeRandom() * (max - min + 1));
|
||||
}
|
||||
|
||||
export default baseRandom;
|
||||
24
internal/baseReduce.js
Normal file
24
internal/baseReduce.js
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* The base implementation of `_.reduce` and `_.reduceRight` without support
|
||||
* for callback shorthands or `this` binding, which iterates over `collection`
|
||||
* using the provided `eachFunc`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {*} accumulator The initial value.
|
||||
* @param {boolean} initFromCollection Specify using the first or last element
|
||||
* of `collection` as the initial value.
|
||||
* @param {Function} eachFunc The function to iterate over `collection`.
|
||||
* @returns {*} Returns the accumulated value.
|
||||
*/
|
||||
function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {
|
||||
eachFunc(collection, function(value, index, collection) {
|
||||
accumulator = initFromCollection
|
||||
? (initFromCollection = false, value)
|
||||
: iteratee(accumulator, value, index, collection)
|
||||
});
|
||||
return accumulator;
|
||||
}
|
||||
|
||||
export default baseReduce;
|
||||
17
internal/baseSetData.js
Normal file
17
internal/baseSetData.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import identity from '../utility/identity';
|
||||
import metaMap from './metaMap';
|
||||
|
||||
/**
|
||||
* The base implementation of `setData` without support for hot loop detection.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to associate metadata with.
|
||||
* @param {*} data The metadata.
|
||||
* @returns {Function} Returns `func`.
|
||||
*/
|
||||
var baseSetData = !metaMap ? identity : function(func, data) {
|
||||
metaMap.set(func, data);
|
||||
return func;
|
||||
};
|
||||
|
||||
export default baseSetData;
|
||||
31
internal/baseSlice.js
Normal file
31
internal/baseSlice.js
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* The base implementation of `_.slice` without an iteratee call guard.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to slice.
|
||||
* @param {number} [start=0] The start position.
|
||||
* @param {number} [end=array.length] The end position.
|
||||
* @returns {Array} Returns the slice of `array`.
|
||||
*/
|
||||
function baseSlice(array, start, end) {
|
||||
var index = -1,
|
||||
length = array.length;
|
||||
|
||||
start = start == null ? 0 : (+start || 0);
|
||||
if (start < 0) {
|
||||
start = -start > length ? 0 : (length + start);
|
||||
}
|
||||
end = (typeof end == 'undefined' || end > length) ? length : (+end || 0);
|
||||
if (end < 0) {
|
||||
end += length;
|
||||
}
|
||||
length = start > end ? 0 : (end - start);
|
||||
|
||||
var result = Array(length);
|
||||
while (++index < length) {
|
||||
result[index] = array[index + start];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseSlice;
|
||||
23
internal/baseSome.js
Normal file
23
internal/baseSome.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.some` without support for callback shorthands
|
||||
* or `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
||||
* else `false`.
|
||||
*/
|
||||
function baseSome(collection, predicate) {
|
||||
var result;
|
||||
|
||||
baseEach(collection, function(value, index, collection) {
|
||||
result = predicate(value, index, collection);
|
||||
return !result;
|
||||
});
|
||||
return !!result;
|
||||
}
|
||||
|
||||
export default baseSome;
|
||||
21
internal/baseSortBy.js
Normal file
21
internal/baseSortBy.js
Normal file
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* The base implementation of `_.sortBy` and `_.sortByAll` which uses `comparer`
|
||||
* to define the sort order of `array` and replaces criteria objects with their
|
||||
* corresponding values.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to sort.
|
||||
* @param {Function} comparer The function to define sort order.
|
||||
* @returns {Array} Returns `array`.
|
||||
*/
|
||||
function baseSortBy(array, comparer) {
|
||||
var length = array.length;
|
||||
|
||||
array.sort(comparer);
|
||||
while (length--) {
|
||||
array[length] = array[length].value;
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
export default baseSortBy;
|
||||
16
internal/baseToString.js
Normal file
16
internal/baseToString.js
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Converts `value` to a string if it is not one. An empty string is returned
|
||||
* for `null` or `undefined` values.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to process.
|
||||
* @returns {string} Returns the string.
|
||||
*/
|
||||
function baseToString(value) {
|
||||
if (typeof value == 'string') {
|
||||
return value;
|
||||
}
|
||||
return value == null ? '' : (value + '');
|
||||
}
|
||||
|
||||
export default baseToString;
|
||||
57
internal/baseUniq.js
Normal file
57
internal/baseUniq.js
Normal file
@@ -0,0 +1,57 @@
|
||||
import baseIndexOf from './baseIndexOf';
|
||||
import cacheIndexOf from './cacheIndexOf';
|
||||
import createCache from './createCache';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.uniq` without support for callback shorthands
|
||||
* and `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to inspect.
|
||||
* @param {Function} [iteratee] The function invoked per iteration.
|
||||
* @returns {Array} Returns the new duplicate-value-free array.
|
||||
*/
|
||||
function baseUniq(array, iteratee) {
|
||||
var index = -1,
|
||||
indexOf = baseIndexOf,
|
||||
length = array.length,
|
||||
isCommon = true,
|
||||
isLarge = isCommon && length >= 200,
|
||||
seen = isLarge && createCache(),
|
||||
result = [];
|
||||
|
||||
if (seen) {
|
||||
indexOf = cacheIndexOf;
|
||||
isCommon = false;
|
||||
} else {
|
||||
isLarge = false;
|
||||
seen = iteratee ? [] : result;
|
||||
}
|
||||
outer:
|
||||
while (++index < length) {
|
||||
var value = array[index],
|
||||
computed = iteratee ? iteratee(value, index, array) : value;
|
||||
|
||||
if (isCommon && value === value) {
|
||||
var seenIndex = seen.length;
|
||||
while (seenIndex--) {
|
||||
if (seen[seenIndex] === computed) {
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
if (iteratee) {
|
||||
seen.push(computed);
|
||||
}
|
||||
result.push(value);
|
||||
}
|
||||
else if (indexOf(seen, computed) < 0) {
|
||||
if (iteratee || isLarge) {
|
||||
seen.push(computed);
|
||||
}
|
||||
result.push(value);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseUniq;
|
||||
22
internal/baseValues.js
Normal file
22
internal/baseValues.js
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* The base implementation of `_.values` and `_.valuesIn` which creates an
|
||||
* array of `object` property values corresponding to the property names
|
||||
* returned by `keysFunc`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to query.
|
||||
* @param {Array} props The property names to get values for.
|
||||
* @returns {Object} Returns the array of property values.
|
||||
*/
|
||||
function baseValues(object, props) {
|
||||
var index = -1,
|
||||
length = props.length,
|
||||
result = Array(length);
|
||||
|
||||
while (++index < length) {
|
||||
result[index] = object[props[index]];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseValues;
|
||||
37
internal/baseWrapperValue.js
Normal file
37
internal/baseWrapperValue.js
Normal file
@@ -0,0 +1,37 @@
|
||||
import LazyWrapper from './LazyWrapper';
|
||||
|
||||
/** Used for native method references. */
|
||||
var arrayProto = Array.prototype;
|
||||
|
||||
/** Native method references. */
|
||||
var push = arrayProto.push;
|
||||
|
||||
/**
|
||||
* The base implementation of `wrapperValue` which returns the result of
|
||||
* performing a sequence of actions on the unwrapped `value`, where each
|
||||
* successive action is supplied the return value of the previous.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The unwrapped value.
|
||||
* @param {Array} actions Actions to peform to resolve the unwrapped value.
|
||||
* @returns {*} Returns the resolved unwrapped value.
|
||||
*/
|
||||
function baseWrapperValue(value, actions) {
|
||||
var result = value;
|
||||
if (result instanceof LazyWrapper) {
|
||||
result = result.value();
|
||||
}
|
||||
var index = -1,
|
||||
length = actions.length;
|
||||
|
||||
while (++index < length) {
|
||||
var args = [result],
|
||||
action = actions[index];
|
||||
|
||||
push.apply(args, action.args);
|
||||
result = action.func.apply(action.thisArg, args);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseWrapperValue;
|
||||
40
internal/binaryIndex.js
Normal file
40
internal/binaryIndex.js
Normal file
@@ -0,0 +1,40 @@
|
||||
import binaryIndexBy from './binaryIndexBy';
|
||||
import identity from '../utility/identity';
|
||||
|
||||
/** Used as references for the maximum length and index of an array. */
|
||||
var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1,
|
||||
HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
|
||||
|
||||
/**
|
||||
* Performs a binary search of `array` to determine the index at which `value`
|
||||
* should be inserted into `array` in order to maintain its sort order.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The sorted array to inspect.
|
||||
* @param {*} value The value to evaluate.
|
||||
* @param {boolean} [retHighest] Specify returning the highest, instead
|
||||
* of the lowest, index at which a value should be inserted into `array`.
|
||||
* @returns {number} Returns the index at which `value` should be inserted
|
||||
* into `array`.
|
||||
*/
|
||||
function binaryIndex(array, value, retHighest) {
|
||||
var low = 0,
|
||||
high = array ? array.length : low;
|
||||
|
||||
if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
|
||||
while (low < high) {
|
||||
var mid = (low + high) >>> 1,
|
||||
computed = array[mid];
|
||||
|
||||
if (retHighest ? (computed <= value) : (computed < value)) {
|
||||
low = mid + 1;
|
||||
} else {
|
||||
high = mid;
|
||||
}
|
||||
}
|
||||
return high;
|
||||
}
|
||||
return binaryIndexBy(array, value, identity, retHighest);
|
||||
}
|
||||
|
||||
export default binaryIndex;
|
||||
54
internal/binaryIndexBy.js
Normal file
54
internal/binaryIndexBy.js
Normal file
@@ -0,0 +1,54 @@
|
||||
/** Native method references. */
|
||||
var floor = Math.floor;
|
||||
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeMin = Math.min;
|
||||
|
||||
/** Used as references for the maximum length and index of an array. */
|
||||
var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1,
|
||||
MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;
|
||||
|
||||
/**
|
||||
* This function is like `binaryIndex` except that it invokes `iteratee` for
|
||||
* `value` and each element of `array` to compute their sort ranking. The
|
||||
* iteratee is invoked with one argument; (value).
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The sorted array to inspect.
|
||||
* @param {*} value The value to evaluate.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {boolean} [retHighest] Specify returning the highest, instead
|
||||
* of the lowest, index at which a value should be inserted into `array`.
|
||||
* @returns {number} Returns the index at which `value` should be inserted
|
||||
* into `array`.
|
||||
*/
|
||||
function binaryIndexBy(array, value, iteratee, retHighest) {
|
||||
value = iteratee(value);
|
||||
|
||||
var low = 0,
|
||||
high = array ? array.length : 0,
|
||||
valIsNaN = value !== value,
|
||||
valIsUndef = typeof value == 'undefined';
|
||||
|
||||
while (low < high) {
|
||||
var mid = floor((low + high) / 2),
|
||||
computed = iteratee(array[mid]),
|
||||
isReflexive = computed === computed;
|
||||
|
||||
if (valIsNaN) {
|
||||
var setLow = isReflexive || retHighest;
|
||||
} else if (valIsUndef) {
|
||||
setLow = isReflexive && (retHighest || typeof computed != 'undefined');
|
||||
} else {
|
||||
setLow = retHighest ? (computed <= value) : (computed < value);
|
||||
}
|
||||
if (setLow) {
|
||||
low = mid + 1;
|
||||
} else {
|
||||
high = mid;
|
||||
}
|
||||
}
|
||||
return nativeMin(high, MAX_ARRAY_INDEX);
|
||||
}
|
||||
|
||||
export default binaryIndexBy;
|
||||
39
internal/bindCallback.js
Normal file
39
internal/bindCallback.js
Normal file
@@ -0,0 +1,39 @@
|
||||
import identity from '../utility/identity';
|
||||
|
||||
/**
|
||||
* A specialized version of `baseCallback` which only supports `this` binding
|
||||
* and specifying the number of arguments to provide to `func`.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to bind.
|
||||
* @param {*} thisArg The `this` binding of `func`.
|
||||
* @param {number} [argCount] The number of arguments to provide to `func`.
|
||||
* @returns {Function} Returns the callback.
|
||||
*/
|
||||
function bindCallback(func, thisArg, argCount) {
|
||||
if (typeof func != 'function') {
|
||||
return identity;
|
||||
}
|
||||
if (typeof thisArg == 'undefined') {
|
||||
return func;
|
||||
}
|
||||
switch (argCount) {
|
||||
case 1: return function(value) {
|
||||
return func.call(thisArg, value);
|
||||
};
|
||||
case 3: return function(value, index, collection) {
|
||||
return func.call(thisArg, value, index, collection);
|
||||
};
|
||||
case 4: return function(accumulator, value, index, collection) {
|
||||
return func.call(thisArg, accumulator, value, index, collection);
|
||||
};
|
||||
case 5: return function(value, other, key, object, source) {
|
||||
return func.call(thisArg, value, other, key, object, source);
|
||||
};
|
||||
}
|
||||
return function() {
|
||||
return func.apply(thisArg, arguments);
|
||||
};
|
||||
}
|
||||
|
||||
export default bindCallback;
|
||||
56
internal/bufferClone.js
Normal file
56
internal/bufferClone.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import constant from '../utility/constant';
|
||||
import isNative from '../lang/isNative';
|
||||
import root from './root';
|
||||
|
||||
/** Native method references. */
|
||||
var ArrayBuffer = isNative(ArrayBuffer = root.ArrayBuffer) && ArrayBuffer,
|
||||
bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice,
|
||||
floor = Math.floor,
|
||||
Uint8Array = isNative(Uint8Array = root.Uint8Array) && Uint8Array;
|
||||
|
||||
/** Used to clone array buffers. */
|
||||
var Float64Array = (function() {
|
||||
// Safari 5 errors when using an array buffer to initialize a typed array
|
||||
// where the array buffer's `byteLength` is not a multiple of the typed
|
||||
// array's `BYTES_PER_ELEMENT`.
|
||||
try {
|
||||
var func = isNative(func = root.Float64Array) && func,
|
||||
result = new func(new ArrayBuffer(10), 0, 1) && func;
|
||||
} catch(e) {}
|
||||
return result;
|
||||
}());
|
||||
|
||||
/** Used as the size, in bytes, of each `Float64Array` element. */
|
||||
var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0;
|
||||
|
||||
/**
|
||||
* Creates a clone of the given array buffer.
|
||||
*
|
||||
* @private
|
||||
* @param {ArrayBuffer} buffer The array buffer to clone.
|
||||
* @returns {ArrayBuffer} Returns the cloned array buffer.
|
||||
*/
|
||||
function bufferClone(buffer) {
|
||||
return bufferSlice.call(buffer, 0);
|
||||
}
|
||||
if (!bufferSlice) {
|
||||
// PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`.
|
||||
bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) {
|
||||
var byteLength = buffer.byteLength,
|
||||
floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0,
|
||||
offset = floatLength * FLOAT64_BYTES_PER_ELEMENT,
|
||||
result = new ArrayBuffer(byteLength);
|
||||
|
||||
if (floatLength) {
|
||||
var view = new Float64Array(result, 0, floatLength);
|
||||
view.set(new Float64Array(buffer, 0, floatLength));
|
||||
}
|
||||
if (byteLength != offset) {
|
||||
view = new Uint8Array(result, offset);
|
||||
view.set(new Uint8Array(buffer, offset));
|
||||
}
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
export default bufferClone;
|
||||
19
internal/cacheIndexOf.js
Normal file
19
internal/cacheIndexOf.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import isObject from '../lang/isObject';
|
||||
|
||||
/**
|
||||
* Checks if `value` is in `cache` mimicking the return signature of
|
||||
* `_.indexOf` by returning `0` if the value is found, else `-1`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} cache The cache to search.
|
||||
* @param {*} value The value to search for.
|
||||
* @returns {number} Returns `0` if `value` is found, else `-1`.
|
||||
*/
|
||||
function cacheIndexOf(cache, value) {
|
||||
var data = cache.data,
|
||||
result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];
|
||||
|
||||
return result ? 0 : -1;
|
||||
}
|
||||
|
||||
export default cacheIndexOf;
|
||||
20
internal/cachePush.js
Normal file
20
internal/cachePush.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import isObject from '../lang/isObject';
|
||||
|
||||
/**
|
||||
* Adds `value` to the cache.
|
||||
*
|
||||
* @private
|
||||
* @name push
|
||||
* @memberOf SetCache
|
||||
* @param {*} value The value to cache.
|
||||
*/
|
||||
function cachePush(value) {
|
||||
var data = this.data;
|
||||
if (typeof value == 'string' || isObject(value)) {
|
||||
data.set.add(value);
|
||||
} else {
|
||||
data.hash[value] = true;
|
||||
}
|
||||
}
|
||||
|
||||
export default cachePush;
|
||||
12
internal/charAtCallback.js
Normal file
12
internal/charAtCallback.js
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Used by `_.max` and `_.min` as the default callback for string values.
|
||||
*
|
||||
* @private
|
||||
* @param {string} string The string to inspect.
|
||||
* @returns {number} Returns the code unit of the first character of the string.
|
||||
*/
|
||||
function charAtCallback(string) {
|
||||
return string.charCodeAt(0);
|
||||
}
|
||||
|
||||
export default charAtCallback;
|
||||
18
internal/charsLeftIndex.js
Normal file
18
internal/charsLeftIndex.js
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Used by `_.trim` and `_.trimLeft` to get the index of the first character
|
||||
* of `string` that is not found in `chars`.
|
||||
*
|
||||
* @private
|
||||
* @param {string} string The string to inspect.
|
||||
* @param {string} chars The characters to find.
|
||||
* @returns {number} Returns the index of the first character not found in `chars`.
|
||||
*/
|
||||
function charsLeftIndex(string, chars) {
|
||||
var index = -1,
|
||||
length = string.length;
|
||||
|
||||
while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}
|
||||
return index;
|
||||
}
|
||||
|
||||
export default charsLeftIndex;
|
||||
17
internal/charsRightIndex.js
Normal file
17
internal/charsRightIndex.js
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Used by `_.trim` and `_.trimRight` to get the index of the last character
|
||||
* of `string` that is not found in `chars`.
|
||||
*
|
||||
* @private
|
||||
* @param {string} string The string to inspect.
|
||||
* @param {string} chars The characters to find.
|
||||
* @returns {number} Returns the index of the last character not found in `chars`.
|
||||
*/
|
||||
function charsRightIndex(string, chars) {
|
||||
var index = string.length;
|
||||
|
||||
while (index-- && chars.indexOf(string.charAt(index)) > -1) {}
|
||||
return index;
|
||||
}
|
||||
|
||||
export default charsRightIndex;
|
||||
16
internal/compareAscending.js
Normal file
16
internal/compareAscending.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import baseCompareAscending from './baseCompareAscending';
|
||||
|
||||
/**
|
||||
* Used by `_.sortBy` to compare transformed elements of a collection and stable
|
||||
* sort them in ascending order.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to compare to `other`.
|
||||
* @param {Object} other The object to compare to `object`.
|
||||
* @returns {number} Returns the sort order indicator for `object`.
|
||||
*/
|
||||
function compareAscending(object, other) {
|
||||
return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);
|
||||
}
|
||||
|
||||
export default compareAscending;
|
||||
34
internal/compareMultipleAscending.js
Normal file
34
internal/compareMultipleAscending.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import baseCompareAscending from './baseCompareAscending';
|
||||
|
||||
/**
|
||||
* Used by `_.sortByAll` to compare multiple properties of each element
|
||||
* in a collection and stable sort them in ascending order.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to compare to `other`.
|
||||
* @param {Object} other The object to compare to `object`.
|
||||
* @returns {number} Returns the sort order indicator for `object`.
|
||||
*/
|
||||
function compareMultipleAscending(object, other) {
|
||||
var index = -1,
|
||||
objCriteria = object.criteria,
|
||||
othCriteria = other.criteria,
|
||||
length = objCriteria.length;
|
||||
|
||||
while (++index < length) {
|
||||
var result = baseCompareAscending(objCriteria[index], othCriteria[index]);
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
|
||||
// that causes it, under certain circumstances, to provide the same value for
|
||||
// `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
|
||||
// for more details.
|
||||
//
|
||||
// This also ensures a stable sort in V8 and other engines.
|
||||
// See https://code.google.com/p/v8/issues/detail?id=90 for more details.
|
||||
return object.index - other.index;
|
||||
}
|
||||
|
||||
export default compareMultipleAscending;
|
||||
34
internal/composeArgs.js
Normal file
34
internal/composeArgs.js
Normal file
@@ -0,0 +1,34 @@
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeMax = Math.max;
|
||||
|
||||
/**
|
||||
* Creates an array that is the composition of partially applied arguments,
|
||||
* placeholders, and provided arguments into a single array of arguments.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object} args The provided arguments.
|
||||
* @param {Array} partials The arguments to prepend to those provided.
|
||||
* @param {Array} holders The `partials` placeholder indexes.
|
||||
* @returns {Array} Returns the new array of composed arguments.
|
||||
*/
|
||||
function composeArgs(args, partials, holders) {
|
||||
var holdersLength = holders.length,
|
||||
argsIndex = -1,
|
||||
argsLength = nativeMax(args.length - holdersLength, 0),
|
||||
leftIndex = -1,
|
||||
leftLength = partials.length,
|
||||
result = Array(argsLength + leftLength);
|
||||
|
||||
while (++leftIndex < leftLength) {
|
||||
result[leftIndex] = partials[leftIndex];
|
||||
}
|
||||
while (++argsIndex < holdersLength) {
|
||||
result[holders[argsIndex]] = args[argsIndex];
|
||||
}
|
||||
while (argsLength--) {
|
||||
result[leftIndex++] = args[argsIndex++];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default composeArgs;
|
||||
36
internal/composeArgsRight.js
Normal file
36
internal/composeArgsRight.js
Normal file
@@ -0,0 +1,36 @@
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeMax = Math.max;
|
||||
|
||||
/**
|
||||
* This function is like `composeArgs` except that the arguments composition
|
||||
* is tailored for `_.partialRight`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object} args The provided arguments.
|
||||
* @param {Array} partials The arguments to append to those provided.
|
||||
* @param {Array} holders The `partials` placeholder indexes.
|
||||
* @returns {Array} Returns the new array of composed arguments.
|
||||
*/
|
||||
function composeArgsRight(args, partials, holders) {
|
||||
var holdersIndex = -1,
|
||||
holdersLength = holders.length,
|
||||
argsIndex = -1,
|
||||
argsLength = nativeMax(args.length - holdersLength, 0),
|
||||
rightIndex = -1,
|
||||
rightLength = partials.length,
|
||||
result = Array(argsLength + rightLength);
|
||||
|
||||
while (++argsIndex < argsLength) {
|
||||
result[argsIndex] = args[argsIndex];
|
||||
}
|
||||
var pad = argsIndex;
|
||||
while (++rightIndex < rightLength) {
|
||||
result[pad + rightIndex] = partials[rightIndex];
|
||||
}
|
||||
while (++holdersIndex < holdersLength) {
|
||||
result[pad + holders[holdersIndex]] = args[argsIndex++];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default composeArgsRight;
|
||||
38
internal/createAggregator.js
Normal file
38
internal/createAggregator.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import baseCallback from './baseCallback';
|
||||
import baseEach from './baseEach';
|
||||
import isArray from '../lang/isArray';
|
||||
|
||||
/**
|
||||
* Creates a function that aggregates a collection, creating an accumulator
|
||||
* object composed from the results of running each element in the collection
|
||||
* through an iteratee. The `setter` sets the keys and values of the accumulator
|
||||
* object. If `initializer` is provided initializes the accumulator object.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} setter The function to set keys and values of the accumulator object.
|
||||
* @param {Function} [initializer] The function to initialize the accumulator object.
|
||||
* @returns {Function} Returns the new aggregator function.
|
||||
*/
|
||||
function createAggregator(setter, initializer) {
|
||||
return function(collection, iteratee, thisArg) {
|
||||
var result = initializer ? initializer() : {};
|
||||
iteratee = baseCallback(iteratee, thisArg, 3);
|
||||
|
||||
if (isArray(collection)) {
|
||||
var index = -1,
|
||||
length = collection.length;
|
||||
|
||||
while (++index < length) {
|
||||
var value = collection[index];
|
||||
setter(result, value, iteratee(value, index, collection), collection);
|
||||
}
|
||||
} else {
|
||||
baseEach(collection, function(value, key, collection) {
|
||||
setter(result, value, iteratee(value, key, collection), collection);
|
||||
});
|
||||
}
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
export default createAggregator;
|
||||
40
internal/createAssigner.js
Normal file
40
internal/createAssigner.js
Normal file
@@ -0,0 +1,40 @@
|
||||
import bindCallback from './bindCallback';
|
||||
import isIterateeCall from './isIterateeCall';
|
||||
|
||||
/**
|
||||
* Creates a function that assigns properties of source object(s) to a given
|
||||
* destination object.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} assigner The function to assign values.
|
||||
* @returns {Function} Returns the new assigner function.
|
||||
*/
|
||||
function createAssigner(assigner) {
|
||||
return function() {
|
||||
var length = arguments.length,
|
||||
object = arguments[0];
|
||||
|
||||
if (length < 2 || object == null) {
|
||||
return object;
|
||||
}
|
||||
if (length > 3 && isIterateeCall(arguments[1], arguments[2], arguments[3])) {
|
||||
length = 2;
|
||||
}
|
||||
// Juggle arguments.
|
||||
if (length > 3 && typeof arguments[length - 2] == 'function') {
|
||||
var customizer = bindCallback(arguments[--length - 1], arguments[length--], 5);
|
||||
} else if (length > 2 && typeof arguments[length - 1] == 'function') {
|
||||
customizer = arguments[--length];
|
||||
}
|
||||
var index = 0;
|
||||
while (++index < length) {
|
||||
var source = arguments[index];
|
||||
if (source) {
|
||||
assigner(object, source, customizer);
|
||||
}
|
||||
}
|
||||
return object;
|
||||
};
|
||||
}
|
||||
|
||||
export default createAssigner;
|
||||
21
internal/createBindWrapper.js
Normal file
21
internal/createBindWrapper.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import createCtorWrapper from './createCtorWrapper';
|
||||
|
||||
/**
|
||||
* Creates a function that wraps `func` and invokes it with the `this`
|
||||
* binding of `thisArg`.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to bind.
|
||||
* @param {*} [thisArg] The `this` binding of `func`.
|
||||
* @returns {Function} Returns the new bound function.
|
||||
*/
|
||||
function createBindWrapper(func, thisArg) {
|
||||
var Ctor = createCtorWrapper(func);
|
||||
|
||||
function wrapper() {
|
||||
return (this instanceof wrapper ? Ctor : func).apply(thisArg, arguments);
|
||||
}
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
export default createBindWrapper;
|
||||
23
internal/createCache.js
Normal file
23
internal/createCache.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import SetCache from './SetCache';
|
||||
import constant from '../utility/constant';
|
||||
import isNative from '../lang/isNative';
|
||||
import root from './root';
|
||||
|
||||
/** Native method references. */
|
||||
var Set = isNative(Set = root.Set) && Set;
|
||||
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate;
|
||||
|
||||
/**
|
||||
* Creates a `Set` cache object to optimize linear searches of large arrays.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} [values] The values to cache.
|
||||
* @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.
|
||||
*/
|
||||
var createCache = !(nativeCreate && Set) ? constant(null) : function(values) {
|
||||
return new SetCache(values);
|
||||
};
|
||||
|
||||
export default createCache;
|
||||
26
internal/createCompounder.js
Normal file
26
internal/createCompounder.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import deburr from '../string/deburr';
|
||||
import words from '../string/words';
|
||||
|
||||
/**
|
||||
* Creates a function that produces compound words out of the words in a
|
||||
* given string.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} callback The function to combine each word.
|
||||
* @returns {Function} Returns the new compounder function.
|
||||
*/
|
||||
function createCompounder(callback) {
|
||||
return function(string) {
|
||||
var index = -1,
|
||||
array = words(deburr(string)),
|
||||
length = array.length,
|
||||
result = '';
|
||||
|
||||
while (++index < length) {
|
||||
result = callback(result, array[index], index);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
export default createCompounder;
|
||||
23
internal/createCtorWrapper.js
Normal file
23
internal/createCtorWrapper.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import baseCreate from './baseCreate';
|
||||
import isObject from '../lang/isObject';
|
||||
|
||||
/**
|
||||
* Creates a function that produces an instance of `Ctor` regardless of
|
||||
* whether it was invoked as part of a `new` expression or by `call` or `apply`.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} Ctor The constructor to wrap.
|
||||
* @returns {Function} Returns the new wrapped function.
|
||||
*/
|
||||
function createCtorWrapper(Ctor) {
|
||||
return function() {
|
||||
var thisBinding = baseCreate(Ctor.prototype),
|
||||
result = Ctor.apply(thisBinding, arguments);
|
||||
|
||||
// Mimic the constructor's `return` behavior.
|
||||
// See https://es5.github.io/#x13.2.2 for more details.
|
||||
return isObject(result) ? result : thisBinding;
|
||||
};
|
||||
}
|
||||
|
||||
export default createCtorWrapper;
|
||||
38
internal/createExtremum.js
Normal file
38
internal/createExtremum.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import baseCallback from './baseCallback';
|
||||
import charAtCallback from './charAtCallback';
|
||||
import extremumBy from './extremumBy';
|
||||
import isArray from '../lang/isArray';
|
||||
import isIterateeCall from './isIterateeCall';
|
||||
import isString from '../lang/isString';
|
||||
import toIterable from './toIterable';
|
||||
|
||||
/**
|
||||
* Creates a function that gets the extremum value of a collection.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} arrayFunc The function to get the extremum value from an array.
|
||||
* @param {boolean} [isMin] Specify returning the minimum, instead of the maximum,
|
||||
* extremum value.
|
||||
* @returns {Function} Returns the new extremum function.
|
||||
*/
|
||||
function createExtremum(arrayFunc, isMin) {
|
||||
return function(collection, iteratee, thisArg) {
|
||||
if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
|
||||
iteratee = null;
|
||||
}
|
||||
var noIteratee = iteratee == null;
|
||||
|
||||
iteratee = noIteratee ? iteratee : baseCallback(iteratee, thisArg, 3);
|
||||
if (noIteratee) {
|
||||
var isArr = isArray(collection);
|
||||
if (!isArr && isString(collection)) {
|
||||
iteratee = charAtCallback;
|
||||
} else {
|
||||
return arrayFunc(isArr ? collection : toIterable(collection));
|
||||
}
|
||||
}
|
||||
return extremumBy(collection, iteratee, isMin);
|
||||
};
|
||||
}
|
||||
|
||||
export default createExtremum;
|
||||
104
internal/createHybridWrapper.js
Normal file
104
internal/createHybridWrapper.js
Normal file
@@ -0,0 +1,104 @@
|
||||
import arrayCopy from './arrayCopy';
|
||||
import composeArgs from './composeArgs';
|
||||
import composeArgsRight from './composeArgsRight';
|
||||
import createCtorWrapper from './createCtorWrapper';
|
||||
import reorder from './reorder';
|
||||
import replaceHolders from './replaceHolders';
|
||||
|
||||
/** Used to compose bitmasks for wrapper metadata. */
|
||||
var BIND_FLAG = 1,
|
||||
BIND_KEY_FLAG = 2,
|
||||
CURRY_BOUND_FLAG = 4,
|
||||
CURRY_FLAG = 8,
|
||||
CURRY_RIGHT_FLAG = 16,
|
||||
PARTIAL_FLAG = 32,
|
||||
PARTIAL_RIGHT_FLAG = 64,
|
||||
ARY_FLAG = 256;
|
||||
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeMax = Math.max;
|
||||
|
||||
/**
|
||||
* Creates a function that wraps `func` and invokes it with optional `this`
|
||||
* binding of, partial application, and currying.
|
||||
*
|
||||
* @private
|
||||
* @param {Function|string} func The function or method name to reference.
|
||||
* @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
|
||||
* @param {*} [thisArg] The `this` binding of `func`.
|
||||
* @param {Array} [partials] The arguments to prepend to those provided to the new function.
|
||||
* @param {Array} [holders] The `partials` placeholder indexes.
|
||||
* @param {Array} [partialsRight] The arguments to append to those provided to the new function.
|
||||
* @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
|
||||
* @param {Array} [argPos] The argument positions of the new function.
|
||||
* @param {number} [ary] The arity cap of `func`.
|
||||
* @param {number} [arity] The arity of `func`.
|
||||
* @returns {Function} Returns the new wrapped function.
|
||||
*/
|
||||
function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
|
||||
var isAry = bitmask & ARY_FLAG,
|
||||
isBind = bitmask & BIND_FLAG,
|
||||
isBindKey = bitmask & BIND_KEY_FLAG,
|
||||
isCurry = bitmask & CURRY_FLAG,
|
||||
isCurryBound = bitmask & CURRY_BOUND_FLAG,
|
||||
isCurryRight = bitmask & CURRY_RIGHT_FLAG;
|
||||
|
||||
var Ctor = !isBindKey && createCtorWrapper(func),
|
||||
key = func;
|
||||
|
||||
function wrapper() {
|
||||
// Avoid `arguments` object use disqualifying optimizations by
|
||||
// converting it to an array before providing it to other functions.
|
||||
var length = arguments.length,
|
||||
index = length,
|
||||
args = Array(length);
|
||||
|
||||
while (index--) {
|
||||
args[index] = arguments[index];
|
||||
}
|
||||
if (partials) {
|
||||
args = composeArgs(args, partials, holders);
|
||||
}
|
||||
if (partialsRight) {
|
||||
args = composeArgsRight(args, partialsRight, holdersRight);
|
||||
}
|
||||
if (isCurry || isCurryRight) {
|
||||
var placeholder = wrapper.placeholder,
|
||||
argsHolders = replaceHolders(args, placeholder);
|
||||
|
||||
length -= argsHolders.length;
|
||||
if (length < arity) {
|
||||
var newArgPos = argPos ? arrayCopy(argPos) : null,
|
||||
newArity = nativeMax(arity - length, 0),
|
||||
newsHolders = isCurry ? argsHolders : null,
|
||||
newHoldersRight = isCurry ? null : argsHolders,
|
||||
newPartials = isCurry ? args : null,
|
||||
newPartialsRight = isCurry ? null : args;
|
||||
|
||||
bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);
|
||||
bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);
|
||||
|
||||
if (!isCurryBound) {
|
||||
bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
|
||||
}
|
||||
var result = createHybridWrapper(func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity);
|
||||
result.placeholder = placeholder;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
var thisBinding = isBind ? thisArg : this;
|
||||
if (isBindKey) {
|
||||
func = thisBinding[key];
|
||||
}
|
||||
if (argPos) {
|
||||
args = reorder(args, argPos);
|
||||
}
|
||||
if (isAry && ary < args.length) {
|
||||
args.length = ary;
|
||||
}
|
||||
return (this instanceof wrapper ? (Ctor || createCtorWrapper(func)) : func).apply(thisBinding, args);
|
||||
}
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
export default createHybridWrapper;
|
||||
34
internal/createPad.js
Normal file
34
internal/createPad.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import baseToString from './baseToString';
|
||||
import repeat from '../string/repeat';
|
||||
import root from './root';
|
||||
|
||||
/** Native method references. */
|
||||
var ceil = Math.ceil;
|
||||
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeIsFinite = root.isFinite;
|
||||
|
||||
/**
|
||||
* Creates the pad required for `string` based on the given padding length.
|
||||
* The `chars` string may be truncated if the number of padding characters
|
||||
* exceeds the padding length.
|
||||
*
|
||||
* @private
|
||||
* @param {string} string The string to create padding for.
|
||||
* @param {number} [length=0] The padding length.
|
||||
* @param {string} [chars=' '] The string used as padding.
|
||||
* @returns {string} Returns the pad for `string`.
|
||||
*/
|
||||
function createPad(string, length, chars) {
|
||||
var strLength = string.length;
|
||||
length = +length;
|
||||
|
||||
if (strLength >= length || !nativeIsFinite(length)) {
|
||||
return '';
|
||||
}
|
||||
var padLength = length - strLength;
|
||||
chars = chars == null ? ' ' : baseToString(chars);
|
||||
return repeat(chars, ceil(padLength / chars.length)).slice(0, padLength);
|
||||
}
|
||||
|
||||
export default createPad;
|
||||
42
internal/createPartialWrapper.js
Normal file
42
internal/createPartialWrapper.js
Normal file
@@ -0,0 +1,42 @@
|
||||
import createCtorWrapper from './createCtorWrapper';
|
||||
|
||||
/** Used to compose bitmasks for wrapper metadata. */
|
||||
var BIND_FLAG = 1;
|
||||
|
||||
/**
|
||||
* Creates a function that wraps `func` and invokes it with the optional `this`
|
||||
* binding of `thisArg` and the `partials` prepended to those provided to
|
||||
* the wrapper.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to partially apply arguments to.
|
||||
* @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
|
||||
* @param {*} thisArg The `this` binding of `func`.
|
||||
* @param {Array} partials The arguments to prepend to those provided to the new function.
|
||||
* @returns {Function} Returns the new bound function.
|
||||
*/
|
||||
function createPartialWrapper(func, bitmask, thisArg, partials) {
|
||||
var isBind = bitmask & BIND_FLAG,
|
||||
Ctor = createCtorWrapper(func);
|
||||
|
||||
function wrapper() {
|
||||
// Avoid `arguments` object use disqualifying optimizations by
|
||||
// converting it to an array before providing it `func`.
|
||||
var argsIndex = -1,
|
||||
argsLength = arguments.length,
|
||||
leftIndex = -1,
|
||||
leftLength = partials.length,
|
||||
args = Array(argsLength + leftLength);
|
||||
|
||||
while (++leftIndex < leftLength) {
|
||||
args[leftIndex] = partials[leftIndex];
|
||||
}
|
||||
while (argsLength--) {
|
||||
args[leftIndex++] = arguments[++argsIndex];
|
||||
}
|
||||
return (this instanceof wrapper ? Ctor : func).apply(isBind ? thisArg : this, args);
|
||||
}
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
export default createPartialWrapper;
|
||||
87
internal/createWrapper.js
Normal file
87
internal/createWrapper.js
Normal file
@@ -0,0 +1,87 @@
|
||||
import baseSetData from './baseSetData';
|
||||
import createBindWrapper from './createBindWrapper';
|
||||
import createHybridWrapper from './createHybridWrapper';
|
||||
import createPartialWrapper from './createPartialWrapper';
|
||||
import getData from './getData';
|
||||
import isFunction from '../lang/isFunction';
|
||||
import mergeData from './mergeData';
|
||||
import setData from './setData';
|
||||
|
||||
/** Used to compose bitmasks for wrapper metadata. */
|
||||
var BIND_FLAG = 1,
|
||||
BIND_KEY_FLAG = 2,
|
||||
PARTIAL_FLAG = 32,
|
||||
PARTIAL_RIGHT_FLAG = 64;
|
||||
|
||||
/** Used as the `TypeError` message for "Functions" methods. */
|
||||
var FUNC_ERROR_TEXT = 'Expected a function';
|
||||
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeMax = Math.max;
|
||||
|
||||
/**
|
||||
* Creates a function that either curries or invokes `func` with optional
|
||||
* `this` binding and partially applied arguments.
|
||||
*
|
||||
* @private
|
||||
* @param {Function|string} func The function or method name to reference.
|
||||
* @param {number} bitmask The bitmask of flags.
|
||||
* The bitmask may be composed of the following flags:
|
||||
* 1 - `_.bind`
|
||||
* 2 - `_.bindKey`
|
||||
* 4 - `_.curry` or `_.curryRight` of a bound function
|
||||
* 8 - `_.curry`
|
||||
* 16 - `_.curryRight`
|
||||
* 32 - `_.partial`
|
||||
* 64 - `_.partialRight`
|
||||
* 128 - `_.rearg`
|
||||
* 256 - `_.ary`
|
||||
* @param {*} [thisArg] The `this` binding of `func`.
|
||||
* @param {Array} [partials] The arguments to be partially applied.
|
||||
* @param {Array} [holders] The `partials` placeholder indexes.
|
||||
* @param {Array} [argPos] The argument positions of the new function.
|
||||
* @param {number} [ary] The arity cap of `func`.
|
||||
* @param {number} [arity] The arity of `func`.
|
||||
* @returns {Function} Returns the new wrapped function.
|
||||
*/
|
||||
function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
|
||||
var isBindKey = bitmask & BIND_KEY_FLAG;
|
||||
if (!isBindKey && !isFunction(func)) {
|
||||
throw new TypeError(FUNC_ERROR_TEXT);
|
||||
}
|
||||
var length = partials ? partials.length : 0;
|
||||
if (!length) {
|
||||
bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
|
||||
partials = holders = null;
|
||||
}
|
||||
length -= (holders ? holders.length : 0);
|
||||
if (bitmask & PARTIAL_RIGHT_FLAG) {
|
||||
var partialsRight = partials,
|
||||
holdersRight = holders;
|
||||
|
||||
partials = holders = null;
|
||||
}
|
||||
var data = !isBindKey && getData(func),
|
||||
newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
|
||||
|
||||
if (data && data !== true) {
|
||||
mergeData(newData, data);
|
||||
bitmask = newData[1];
|
||||
arity = newData[9];
|
||||
}
|
||||
newData[9] = arity == null
|
||||
? (isBindKey ? 0 : func.length)
|
||||
: (nativeMax(arity - length, 0) || 0);
|
||||
|
||||
if (bitmask == BIND_FLAG) {
|
||||
var result = createBindWrapper(newData[0], newData[2]);
|
||||
} else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {
|
||||
result = createPartialWrapper.apply(null, newData);
|
||||
} else {
|
||||
result = createHybridWrapper.apply(null, newData);
|
||||
}
|
||||
var setter = data ? baseSetData : setData;
|
||||
return setter(result, newData);
|
||||
}
|
||||
|
||||
export default createWrapper;
|
||||
33
internal/deburrLetter.js
Normal file
33
internal/deburrLetter.js
Normal file
@@ -0,0 +1,33 @@
|
||||
/** Used to map latin-1 supplementary letters to basic latin letters. */
|
||||
var deburredLetters = {
|
||||
'\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
|
||||
'\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
|
||||
'\xc7': 'C', '\xe7': 'c',
|
||||
'\xd0': 'D', '\xf0': 'd',
|
||||
'\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
|
||||
'\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
|
||||
'\xcC': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
|
||||
'\xeC': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
|
||||
'\xd1': 'N', '\xf1': 'n',
|
||||
'\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
|
||||
'\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
|
||||
'\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
|
||||
'\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
|
||||
'\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
|
||||
'\xc6': 'Ae', '\xe6': 'ae',
|
||||
'\xde': 'Th', '\xfe': 'th',
|
||||
'\xdf': 'ss'
|
||||
};
|
||||
|
||||
/**
|
||||
* Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.
|
||||
*
|
||||
* @private
|
||||
* @param {string} letter The matched letter to deburr.
|
||||
* @returns {string} Returns the deburred letter.
|
||||
*/
|
||||
function deburrLetter(letter) {
|
||||
return deburredLetters[letter];
|
||||
}
|
||||
|
||||
export default deburrLetter;
|
||||
54
internal/equalArrays.js
Normal file
54
internal/equalArrays.js
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* A specialized version of `baseIsEqualDeep` for arrays with support for
|
||||
* partial deep comparisons.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to compare.
|
||||
* @param {Array} other The other array to compare.
|
||||
* @param {Function} equalFunc The function to determine equivalents of values.
|
||||
* @param {Function} [customizer] The function to customize comparing arrays.
|
||||
* @param {boolean} [isWhere] Specify performing partial comparisons.
|
||||
* @param {Array} [stackA] Tracks traversed `value` objects.
|
||||
* @param {Array} [stackB] Tracks traversed `other` objects.
|
||||
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
|
||||
*/
|
||||
function equalArrays(array, other, equalFunc, customizer, isWhere, stackA, stackB) {
|
||||
var index = -1,
|
||||
arrLength = array.length,
|
||||
othLength = other.length,
|
||||
result = true;
|
||||
|
||||
if (arrLength != othLength && !(isWhere && othLength > arrLength)) {
|
||||
return false;
|
||||
}
|
||||
// Deep compare the contents, ignoring non-numeric properties.
|
||||
while (result && ++index < arrLength) {
|
||||
var arrValue = array[index],
|
||||
othValue = other[index];
|
||||
|
||||
result = undefined;
|
||||
if (customizer) {
|
||||
result = isWhere
|
||||
? customizer(othValue, arrValue, index)
|
||||
: customizer(arrValue, othValue, index);
|
||||
}
|
||||
if (typeof result == 'undefined') {
|
||||
// Recursively compare arrays (susceptible to call stack limits).
|
||||
if (isWhere) {
|
||||
var othIndex = othLength;
|
||||
while (othIndex--) {
|
||||
othValue = other[othIndex];
|
||||
result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);
|
||||
if (result) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);
|
||||
}
|
||||
}
|
||||
}
|
||||
return !!result;
|
||||
}
|
||||
|
||||
export default equalArrays;
|
||||
51
internal/equalByTag.js
Normal file
51
internal/equalByTag.js
Normal file
@@ -0,0 +1,51 @@
|
||||
import baseToString from './baseToString';
|
||||
|
||||
/** `Object#toString` result references. */
|
||||
var boolTag = '[object Boolean]',
|
||||
dateTag = '[object Date]',
|
||||
errorTag = '[object Error]',
|
||||
numberTag = '[object Number]',
|
||||
regexpTag = '[object RegExp]',
|
||||
stringTag = '[object String]';
|
||||
|
||||
/**
|
||||
* A specialized version of `baseIsEqualDeep` for comparing objects of
|
||||
* the same `toStringTag`.
|
||||
*
|
||||
* **Note:** This function only supports comparing values with tags of
|
||||
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} value The object to compare.
|
||||
* @param {Object} other The other object to compare.
|
||||
* @param {string} tag The `toStringTag` of the objects to compare.
|
||||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||||
*/
|
||||
function equalByTag(object, other, tag) {
|
||||
switch (tag) {
|
||||
case boolTag:
|
||||
case dateTag:
|
||||
// Coerce dates and booleans to numbers, dates to milliseconds and booleans
|
||||
// to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
|
||||
return +object == +other;
|
||||
|
||||
case errorTag:
|
||||
return object.name == other.name && object.message == other.message;
|
||||
|
||||
case numberTag:
|
||||
// Treat `NaN` vs. `NaN` as equal.
|
||||
return (object != +object)
|
||||
? other != +other
|
||||
// But, treat `-0` vs. `+0` as not equal.
|
||||
: (object == 0 ? ((1 / object) == (1 / other)) : object == +other);
|
||||
|
||||
case regexpTag:
|
||||
case stringTag:
|
||||
// Coerce regexes to strings and treat strings primitives and string
|
||||
// objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
|
||||
return object == baseToString(other);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export default equalByTag;
|
||||
72
internal/equalObjects.js
Normal file
72
internal/equalObjects.js
Normal file
@@ -0,0 +1,72 @@
|
||||
import keys from '../object/keys';
|
||||
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* A specialized version of `baseIsEqualDeep` for objects with support for
|
||||
* partial deep comparisons.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to compare.
|
||||
* @param {Object} other The other object to compare.
|
||||
* @param {Function} equalFunc The function to determine equivalents of values.
|
||||
* @param {Function} [customizer] The function to customize comparing values.
|
||||
* @param {boolean} [isWhere] Specify performing partial comparisons.
|
||||
* @param {Array} [stackA] Tracks traversed `value` objects.
|
||||
* @param {Array} [stackB] Tracks traversed `other` objects.
|
||||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||||
*/
|
||||
function equalObjects(object, other, equalFunc, customizer, isWhere, stackA, stackB) {
|
||||
var objProps = keys(object),
|
||||
objLength = objProps.length,
|
||||
othProps = keys(other),
|
||||
othLength = othProps.length;
|
||||
|
||||
if (objLength != othLength && !isWhere) {
|
||||
return false;
|
||||
}
|
||||
var hasCtor,
|
||||
index = -1;
|
||||
|
||||
while (++index < objLength) {
|
||||
var key = objProps[index],
|
||||
result = hasOwnProperty.call(other, key);
|
||||
|
||||
if (result) {
|
||||
var objValue = object[key],
|
||||
othValue = other[key];
|
||||
|
||||
result = undefined;
|
||||
if (customizer) {
|
||||
result = isWhere
|
||||
? customizer(othValue, objValue, key)
|
||||
: customizer(objValue, othValue, key);
|
||||
}
|
||||
if (typeof result == 'undefined') {
|
||||
// Recursively compare objects (susceptible to call stack limits).
|
||||
result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isWhere, stackA, stackB);
|
||||
}
|
||||
}
|
||||
if (!result) {
|
||||
return false;
|
||||
}
|
||||
hasCtor || (hasCtor = key == 'constructor');
|
||||
}
|
||||
if (!hasCtor) {
|
||||
var objCtor = object.constructor,
|
||||
othCtor = other.constructor;
|
||||
|
||||
// Non `Object` object instances with different constructors are not equal.
|
||||
if (objCtor != othCtor && ('constructor' in object && 'constructor' in other) &&
|
||||
!(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export default equalObjects;
|
||||
22
internal/escapeHtmlChar.js
Normal file
22
internal/escapeHtmlChar.js
Normal file
@@ -0,0 +1,22 @@
|
||||
/** Used to map characters to HTML entities. */
|
||||
var htmlEscapes = {
|
||||
'&': '&',
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'"': '"',
|
||||
"'": ''',
|
||||
'`': '`'
|
||||
};
|
||||
|
||||
/**
|
||||
* Used by `_.escape` to convert characters to HTML entities.
|
||||
*
|
||||
* @private
|
||||
* @param {string} chr The matched character to escape.
|
||||
* @returns {string} Returns the escaped character.
|
||||
*/
|
||||
function escapeHtmlChar(chr) {
|
||||
return htmlEscapes[chr];
|
||||
}
|
||||
|
||||
export default escapeHtmlChar;
|
||||
23
internal/escapeStringChar.js
Normal file
23
internal/escapeStringChar.js
Normal file
@@ -0,0 +1,23 @@
|
||||
/** Used to escape characters for inclusion in compiled string literals. */
|
||||
var stringEscapes = {
|
||||
'\\': '\\',
|
||||
"'": "'",
|
||||
'\n': 'n',
|
||||
'\r': 'r',
|
||||
'\u2028': 'u2028',
|
||||
'\u2029': 'u2029'
|
||||
};
|
||||
|
||||
/**
|
||||
* Used by `_.template` to escape characters for inclusion in compiled
|
||||
* string literals.
|
||||
*
|
||||
* @private
|
||||
* @param {string} chr The matched character to escape.
|
||||
* @returns {string} Returns the escaped character.
|
||||
*/
|
||||
function escapeStringChar(chr) {
|
||||
return '\\' + stringEscapes[chr];
|
||||
}
|
||||
|
||||
export default escapeStringChar;
|
||||
34
internal/extremumBy.js
Normal file
34
internal/extremumBy.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/** Used as references for `-Infinity` and `Infinity`. */
|
||||
var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,
|
||||
POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
|
||||
|
||||
/**
|
||||
* Gets the extremum value of `collection` invoking `iteratee` for each value
|
||||
* in `collection` to generate the criterion by which the value is ranked.
|
||||
* The `iteratee` is invoked with three arguments; (value, index, collection).
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {boolean} [isMin] Specify returning the minimum, instead of the
|
||||
* maximum, extremum value.
|
||||
* @returns {*} Returns the extremum value.
|
||||
*/
|
||||
function extremumBy(collection, iteratee, isMin) {
|
||||
var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY,
|
||||
computed = exValue,
|
||||
result = computed;
|
||||
|
||||
baseEach(collection, function(value, index, collection) {
|
||||
var current = iteratee(value, index, collection);
|
||||
if ((isMin ? current < computed : current > computed) || (current === exValue && current === result)) {
|
||||
computed = current;
|
||||
result = value;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export default extremumBy;
|
||||
15
internal/getData.js
Normal file
15
internal/getData.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import metaMap from './metaMap';
|
||||
import noop from '../utility/noop';
|
||||
|
||||
/**
|
||||
* Gets metadata for `func`.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to query.
|
||||
* @returns {*} Returns the metadata for `func`.
|
||||
*/
|
||||
var getData = !metaMap ? noop : function(func) {
|
||||
return metaMap.get(func);
|
||||
};
|
||||
|
||||
export default getData;
|
||||
33
internal/getView.js
Normal file
33
internal/getView.js
Normal file
@@ -0,0 +1,33 @@
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeMax = Math.max,
|
||||
nativeMin = Math.min;
|
||||
|
||||
/**
|
||||
* Gets the view, applying any `transforms` to the `start` and `end` positions.
|
||||
*
|
||||
* @private
|
||||
* @param {number} start The start of the view.
|
||||
* @param {number} end The end of the view.
|
||||
* @param {Array} [transforms] The transformations to apply to the view.
|
||||
* @returns {Object} Returns an object containing the `start` and `end`
|
||||
* positions of the view.
|
||||
*/
|
||||
function getView(start, end, transforms) {
|
||||
var index = -1,
|
||||
length = transforms ? transforms.length : 0;
|
||||
|
||||
while (++index < length) {
|
||||
var data = transforms[index],
|
||||
size = data.size;
|
||||
|
||||
switch (data.type) {
|
||||
case 'drop': start += size; break;
|
||||
case 'dropRight': end -= size; break;
|
||||
case 'take': end = nativeMin(end, start + size); break;
|
||||
case 'takeRight': start = nativeMax(start, end - size); break;
|
||||
}
|
||||
}
|
||||
return { 'start': start, 'end': end };
|
||||
}
|
||||
|
||||
export default getView;
|
||||
24
internal/indexOfNaN.js
Normal file
24
internal/indexOfNaN.js
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Gets the index at which the first occurrence of `NaN` is found in `array`.
|
||||
* If `fromRight` is provided elements of `array` are iterated from right to left.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to search.
|
||||
* @param {number} [fromIndex] The index to search from.
|
||||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||||
* @returns {number} Returns the index of the matched `NaN`, else `-1`.
|
||||
*/
|
||||
function indexOfNaN(array, fromIndex, fromRight) {
|
||||
var length = array.length,
|
||||
index = fromRight ? (fromIndex || length) : ((fromIndex || 0) - 1);
|
||||
|
||||
while ((fromRight ? index-- : ++index < length)) {
|
||||
var other = array[index];
|
||||
if (other !== other) {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
export default indexOfNaN;
|
||||
26
internal/initCloneArray.js
Normal file
26
internal/initCloneArray.js
Normal file
@@ -0,0 +1,26 @@
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* Initializes an array clone.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to clone.
|
||||
* @returns {Array} Returns the initialized clone.
|
||||
*/
|
||||
function initCloneArray(array) {
|
||||
var length = array.length,
|
||||
result = new array.constructor(length);
|
||||
|
||||
// Add array properties assigned by `RegExp#exec`.
|
||||
if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
|
||||
result.index = array.index;
|
||||
result.input = array.input;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default initCloneArray;
|
||||
64
internal/initCloneByTag.js
Normal file
64
internal/initCloneByTag.js
Normal file
@@ -0,0 +1,64 @@
|
||||
import bufferClone from './bufferClone';
|
||||
|
||||
/** `Object#toString` result references. */
|
||||
var boolTag = '[object Boolean]',
|
||||
dateTag = '[object Date]',
|
||||
numberTag = '[object Number]',
|
||||
regexpTag = '[object RegExp]',
|
||||
stringTag = '[object String]';
|
||||
|
||||
var arrayBufferTag = '[object ArrayBuffer]',
|
||||
float32Tag = '[object Float32Array]',
|
||||
float64Tag = '[object Float64Array]',
|
||||
int8Tag = '[object Int8Array]',
|
||||
int16Tag = '[object Int16Array]',
|
||||
int32Tag = '[object Int32Array]',
|
||||
uint8Tag = '[object Uint8Array]',
|
||||
uint8ClampedTag = '[object Uint8ClampedArray]',
|
||||
uint16Tag = '[object Uint16Array]',
|
||||
uint32Tag = '[object Uint32Array]';
|
||||
|
||||
/** Used to match `RegExp` flags from their coerced string values. */
|
||||
var reFlags = /\w*$/;
|
||||
|
||||
/**
|
||||
* Initializes an object clone based on its `toStringTag`.
|
||||
*
|
||||
* **Note:** This function only supports cloning values with tags of
|
||||
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
|
||||
*
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to clone.
|
||||
* @param {string} tag The `toStringTag` of the object to clone.
|
||||
* @param {boolean} [isDeep] Specify a deep clone.
|
||||
* @returns {Object} Returns the initialized clone.
|
||||
*/
|
||||
function initCloneByTag(object, tag, isDeep) {
|
||||
var Ctor = object.constructor;
|
||||
switch (tag) {
|
||||
case arrayBufferTag:
|
||||
return bufferClone(object);
|
||||
|
||||
case boolTag:
|
||||
case dateTag:
|
||||
return new Ctor(+object);
|
||||
|
||||
case float32Tag: case float64Tag:
|
||||
case int8Tag: case int16Tag: case int32Tag:
|
||||
case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
|
||||
var buffer = object.buffer;
|
||||
return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);
|
||||
|
||||
case numberTag:
|
||||
case stringTag:
|
||||
return new Ctor(object);
|
||||
|
||||
case regexpTag:
|
||||
var result = new Ctor(object.source, reFlags.exec(object));
|
||||
result.lastIndex = object.lastIndex;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default initCloneByTag;
|
||||
16
internal/initCloneObject.js
Normal file
16
internal/initCloneObject.js
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Initializes an object clone.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to clone.
|
||||
* @returns {Object} Returns the initialized clone.
|
||||
*/
|
||||
function initCloneObject(object) {
|
||||
var Ctor = object.constructor;
|
||||
if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {
|
||||
Ctor = Object;
|
||||
}
|
||||
return new Ctor;
|
||||
}
|
||||
|
||||
export default initCloneObject;
|
||||
38
internal/isBindable.js
Normal file
38
internal/isBindable.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import baseSetData from './baseSetData';
|
||||
import isNative from '../lang/isNative';
|
||||
import support from '../support';
|
||||
|
||||
/** Used to detect named functions. */
|
||||
var reFuncName = /^\s*function[ \n\r\t]+\w/;
|
||||
|
||||
/** Used to detect functions containing a `this` reference. */
|
||||
var reThis = /\bthis\b/;
|
||||
|
||||
/** Used to resolve the decompiled source of functions. */
|
||||
var fnToString = Function.prototype.toString;
|
||||
|
||||
/**
|
||||
* Checks if `func` is eligible for `this` binding.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to check.
|
||||
* @returns {boolean} Returns `true` if `func` is eligible, else `false`.
|
||||
*/
|
||||
function isBindable(func) {
|
||||
var result = !(support.funcNames ? func.name : support.funcDecomp);
|
||||
|
||||
if (!result) {
|
||||
var source = fnToString.call(func);
|
||||
if (!support.funcNames) {
|
||||
result = !reFuncName.test(source);
|
||||
}
|
||||
if (!result) {
|
||||
// Check if `func` references the `this` keyword and store the result.
|
||||
result = reThis.test(source) || isNative(func);
|
||||
baseSetData(func, result);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default isBindable;
|
||||
22
internal/isIndex.js
Normal file
22
internal/isIndex.js
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Used as the maximum length of an array-like value.
|
||||
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)
|
||||
* for more details.
|
||||
*/
|
||||
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
|
||||
|
||||
/**
|
||||
* 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 = +value;
|
||||
length = length == null ? MAX_SAFE_INTEGER : length;
|
||||
return value > -1 && value % 1 == 0 && value < length;
|
||||
}
|
||||
|
||||
export default isIndex;
|
||||
28
internal/isIterateeCall.js
Normal file
28
internal/isIterateeCall.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import isIndex from './isIndex';
|
||||
import isLength from './isLength';
|
||||
import isObject from '../lang/isObject';
|
||||
|
||||
/**
|
||||
* Checks if the provided arguments are from an iteratee call.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The potential iteratee value argument.
|
||||
* @param {*} index The potential iteratee index or key argument.
|
||||
* @param {*} object The potential iteratee object argument.
|
||||
* @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
|
||||
*/
|
||||
function isIterateeCall(value, index, object) {
|
||||
if (!isObject(object)) {
|
||||
return false;
|
||||
}
|
||||
var type = typeof index;
|
||||
if (type == 'number') {
|
||||
var length = object.length,
|
||||
prereq = isLength(length) && isIndex(index, length);
|
||||
} else {
|
||||
prereq = type == 'string' && index in value;
|
||||
}
|
||||
return prereq && object[index] === value;
|
||||
}
|
||||
|
||||
export default isIterateeCall;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user