Compare commits

...

3 Commits

Author SHA1 Message Date
John-David Dalton
8349627be6 Bump to v4.8.2. 2016-04-04 13:35:30 -07:00
John-David Dalton
a2438ffc51 Bump to v4.8.0. 2016-04-03 22:48:11 -07:00
John-David Dalton
d46bcaa98d Bump to v4.7.0. 2016-03-31 00:33:47 -07:00
395 changed files with 3659 additions and 1833 deletions

60
LICENSE
View File

@@ -1,23 +1,47 @@
The MIT License (MIT) Copyright jQuery Foundation and other contributors <https://jquery.org/>
Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> Based on Underscore.js, copyright Jeremy Ashkenas,
Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/> DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
Permission is hereby granted, free of charge, to any person obtaining a copy This software consists of voluntary contributions made by many
of this software and associated documentation files (the "Software"), to deal individuals. For exact contribution history, see the revision history
in the Software without restriction, including without limitation the rights available at https://github.com/lodash/lodash
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The following license applies to all parts of this software except as
copies or substantial portions of the Software. documented below:
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ====
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE Permission is hereby granted, free of charge, to any person obtaining
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER a copy of this software and associated documentation files (the
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, "Software"), to deal in the Software without restriction, including
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE without limitation the rights to use, copy, modify, merge, publish,
SOFTWARE. distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.
CC0: http://creativecommons.org/publicdomain/zero/1.0/
====
Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.

View File

@@ -1,6 +1,6 @@
# lodash-amd v4.6.1 # lodash-amd v4.8.2
The [lodash](https://lodash.com/) library exported as [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules. The [Lodash](https://lodash.com/) library exported as [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules.
Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli): Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
```bash ```bash
@@ -27,4 +27,4 @@ require({
}); });
``` ```
See the [package source](https://github.com/lodash/lodash/tree/4.6.1-amd) for more details. See the [package source](https://github.com/lodash/lodash/tree/4.8.2-amd) for more details.

7
_DataView.js Normal file
View File

@@ -0,0 +1,7 @@
define(['./_getNative', './_root'], function(getNative, root) {
/* Built-in method references that are verified to be native. */
var DataView = getNative(root, 'DataView');
return DataView;
});

View File

@@ -20,6 +20,7 @@ define(['./_baseCreate', './_baseLodash'], function(baseCreate, baseLodash) {
this.__views__ = []; this.__views__ = [];
} }
// Ensure `LazyWrapper` is an instance of `baseLodash`.
LazyWrapper.prototype = baseCreate(baseLodash.prototype); LazyWrapper.prototype = baseCreate(baseLodash.prototype);
LazyWrapper.prototype.constructor = LazyWrapper; LazyWrapper.prototype.constructor = LazyWrapper;

View File

@@ -8,7 +8,7 @@ define(['./_baseCreate', './_baseLodash'], function(baseCreate, baseLodash) {
* *
* @private * @private
* @param {*} value The value to wrap. * @param {*} value The value to wrap.
* @param {boolean} [chainAll] Enable chaining for all wrapper methods. * @param {boolean} [chainAll] Enable explicit method chain sequences.
*/ */
function LodashWrapper(value, chainAll) { function LodashWrapper(value, chainAll) {
this.__wrapped__ = value; this.__wrapped__ = value;

View File

@@ -18,7 +18,7 @@ define(['./_mapClear', './_mapDelete', './_mapGet', './_mapHas', './_mapSet'], f
} }
} }
// Add functions to the `MapCache`. // Add methods to `MapCache`.
MapCache.prototype.clear = mapClear; MapCache.prototype.clear = mapClear;
MapCache.prototype['delete'] = mapDelete; MapCache.prototype['delete'] = mapDelete;
MapCache.prototype.get = mapGet; MapCache.prototype.get = mapGet;

7
_Promise.js Normal file
View File

@@ -0,0 +1,7 @@
define(['./_getNative', './_root'], function(getNative, root) {
/* Built-in method references that are verified to be native. */
var Promise = getNative(root, 'Promise');
return Promise;
});

View File

@@ -18,7 +18,7 @@ define(['./_MapCache', './_cachePush'], function(MapCache, cachePush) {
} }
} }
// Add functions to the `SetCache`. // Add methods to `SetCache`.
SetCache.prototype.push = cachePush; SetCache.prototype.push = cachePush;
return SetCache; return SetCache;

View File

@@ -18,7 +18,7 @@ define(['./_stackClear', './_stackDelete', './_stackGet', './_stackHas', './_sta
} }
} }
// Add functions to the `Stack` cache. // Add methods to `Stack`.
Stack.prototype.clear = stackClear; Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete; Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet; Stack.prototype.get = stackGet;

View File

@@ -7,7 +7,7 @@ define([], function() {
* @private * @private
* @param {Function} func The function to invoke. * @param {Function} func The function to invoke.
* @param {*} thisArg The `this` binding of `func`. * @param {*} thisArg The `this` binding of `func`.
* @param {...*} args The arguments to invoke `func` with. * @param {Array} args The arguments to invoke `func` with.
* @returns {*} Returns the result of `func`. * @returns {*} Returns the result of `func`.
*/ */
function apply(func, thisArg, args) { function apply(func, thisArg, args) {

View File

@@ -7,7 +7,8 @@ define([], function() {
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} array The array to iterate over.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if all elements pass the predicate check, else `false`. * @returns {boolean} Returns `true` if all elements pass the predicate check,
* else `false`.
*/ */
function arrayEvery(array, predicate) { function arrayEvery(array, predicate) {
var index = -1, var index = -1,

View File

@@ -8,7 +8,8 @@ define([], function() {
* @param {Array} array The array to iterate over. * @param {Array} array The array to iterate over.
* @param {Function} iteratee The function invoked per iteration. * @param {Function} iteratee The function invoked per iteration.
* @param {*} [accumulator] The initial value. * @param {*} [accumulator] The initial value.
* @param {boolean} [initAccum] Specify using the first element of `array` as the initial value. * @param {boolean} [initAccum] Specify using the first element of `array` as
* the initial value.
* @returns {*} Returns the accumulated value. * @returns {*} Returns the accumulated value.
*/ */
function arrayReduce(array, iteratee, accumulator, initAccum) { function arrayReduce(array, iteratee, accumulator, initAccum) {

View File

@@ -8,7 +8,8 @@ define([], function() {
* @param {Array} array The array to iterate over. * @param {Array} array The array to iterate over.
* @param {Function} iteratee The function invoked per iteration. * @param {Function} iteratee The function invoked per iteration.
* @param {*} [accumulator] The initial value. * @param {*} [accumulator] The initial value.
* @param {boolean} [initAccum] Specify using the last element of `array` as the initial value. * @param {boolean} [initAccum] Specify using the last element of `array` as
* the initial value.
* @returns {*} Returns the accumulated value. * @returns {*} Returns the accumulated value.
*/ */
function arrayReduceRight(array, iteratee, accumulator, initAccum) { function arrayReduceRight(array, iteratee, accumulator, initAccum) {

View File

@@ -7,7 +7,8 @@ define([], function() {
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} array The array to iterate over.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if any element passes the predicate check, else `false`. * @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
*/ */
function arraySome(array, predicate) { function arraySome(array, predicate) {
var index = -1, var index = -1,

View File

@@ -10,7 +10,7 @@ define(['./_assocIndexOf'], function(assocIndexOf) {
* Removes `key` and its value from the associative array. * Removes `key` and its value from the associative array.
* *
* @private * @private
* @param {Array} array The array to query. * @param {Array} array The array to modify.
* @param {string} key The key of the value to remove. * @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/ */

View File

@@ -1,8 +1,7 @@
define(['./eq'], function(eq) { define(['./eq'], function(eq) {
/** /**
* Gets the index at which the first occurrence of `key` is found in `array` * Gets the index at which the `key` is found in `array` of key-value pairs.
* of key-value pairs.
* *
* @private * @private
* @param {Array} array The array to search. * @param {Array} array The array to search.

View File

@@ -5,7 +5,7 @@ define(['./isArrayLikeObject'], function(isArrayLikeObject) {
* *
* @private * @private
* @param {*} value The value to inspect. * @param {*} value The value to inspect.
* @returns {Array} Returns the array-like object. * @returns {Array|Object} Returns the cast array-like object.
*/ */
function baseCastArrayLikeObject(value) { function baseCastArrayLikeObject(value) {
return isArrayLikeObject(value) ? value : []; return isArrayLikeObject(value) ? value : [];

View File

@@ -5,7 +5,7 @@ define(['./identity'], function(identity) {
* *
* @private * @private
* @param {*} value The value to inspect. * @param {*} value The value to inspect.
* @returns {Array} Returns the array-like object. * @returns {Function} Returns cast function.
*/ */
function baseCastFunction(value) { function baseCastFunction(value) {
return typeof value == 'function' ? value : identity; return typeof value == 'function' ? value : identity;

15
_baseCastKey.js Normal file
View File

@@ -0,0 +1,15 @@
define(['./isSymbol'], function(isSymbol) {
/**
* Casts `value` to a string if it's not a string or symbol.
*
* @private
* @param {*} value The value to inspect.
* @returns {string|symbol} Returns the cast key.
*/
function baseCastKey(key) {
return (typeof key == 'string' || isSymbol(key)) ? key : (key + '');
}
return baseCastKey;
});

View File

@@ -1,4 +1,4 @@
define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_baseForOwn', './_cloneBuffer', './_copyArray', './_copySymbols', './_getTag', './_initCloneArray', './_initCloneByTag', './_initCloneObject', './isArray', './isBuffer', './_isHostObject', './isObject'], function(Stack, arrayEach, assignValue, baseAssign, baseForOwn, cloneBuffer, copyArray, copySymbols, getTag, initCloneArray, initCloneByTag, initCloneObject, isArray, isBuffer, isHostObject, isObject) { define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_cloneBuffer', './_copyArray', './_copySymbols', './_getAllKeys', './_getTag', './_initCloneArray', './_initCloneByTag', './_initCloneObject', './isArray', './isBuffer', './_isHostObject', './isObject', './keys'], function(Stack, arrayEach, assignValue, baseAssign, cloneBuffer, copyArray, copySymbols, getAllKeys, getTag, initCloneArray, initCloneByTag, initCloneObject, isArray, isBuffer, isHostObject, isObject, keys) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined; var undefined;
@@ -21,6 +21,7 @@ define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_baseF
weakMapTag = '[object WeakMap]'; weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]', var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]', float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]', float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]', int8Tag = '[object Int8Array]',
@@ -34,16 +35,16 @@ define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_baseF
/** Used to identify `toStringTag` values supported by `_.clone`. */ /** Used to identify `toStringTag` values supported by `_.clone`. */
var cloneableTags = {}; var cloneableTags = {};
cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[argsTag] = cloneableTags[arrayTag] =
cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[boolTag] = cloneableTags[dateTag] =
cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] =
cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] =
cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[int32Tag] = cloneableTags[mapTag] =
cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[numberTag] = cloneableTags[objectTag] =
cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[regexpTag] = cloneableTags[setTag] =
cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[stringTag] = cloneableTags[symbolTag] =
cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
cloneableTags[uint32Tag] = true; cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[errorTag] = cloneableTags[funcTag] =
cloneableTags[weakMapTag] = false; cloneableTags[weakMapTag] = false;
@@ -91,14 +92,13 @@ define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_baseF
} }
result = initCloneObject(isFunc ? {} : value); result = initCloneObject(isFunc ? {} : value);
if (!isDeep) { if (!isDeep) {
result = baseAssign(result, value); return copySymbols(value, baseAssign(result, value));
return isFull ? copySymbols(value, result) : result;
} }
} else { } else {
if (!cloneableTags[tag]) { if (!cloneableTags[tag]) {
return object ? value : {}; return object ? value : {};
} }
result = initCloneByTag(value, tag, isDeep); result = initCloneByTag(value, tag, baseClone, isDeep);
} }
} }
// Check for circular references and return its corresponding clone. // Check for circular references and return its corresponding clone.
@@ -109,11 +109,18 @@ define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_baseF
} }
stack.set(value, result); stack.set(value, result);
if (!isArr) {
var props = isFull ? getAllKeys(value) : keys(value);
}
// Recursively populate clone (susceptible to call stack limits). // Recursively populate clone (susceptible to call stack limits).
(isArr ? arrayEach : baseForOwn)(value, function(subValue, key) { arrayEach(props || value, function(subValue, key) {
if (props) {
key = subValue;
subValue = value[key];
}
assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack)); assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
}); });
return (isFull && !isArr) ? copySymbols(value, result) : result; return result;
} }
return baseClone; return baseClone;

View File

@@ -24,7 +24,8 @@ define(['./keys'], function(keys) {
predicate = source[key], predicate = source[key],
value = object[key]; value = object[key];
if ((value === undefined && !(key in Object(object))) || !predicate(value)) { if ((value === undefined &&
!(key in Object(object))) || !predicate(value)) {
return false; return false;
} }
} }

View File

@@ -4,8 +4,8 @@ define(['./_SetCache', './_arrayIncludes', './_arrayIncludesWith', './_arrayMap'
var LARGE_ARRAY_SIZE = 200; var LARGE_ARRAY_SIZE = 200;
/** /**
* The base implementation of methods like `_.difference` without support for * The base implementation of methods like `_.difference` without support
* excluding multiple arrays or iteratee shorthands. * for excluding multiple arrays or iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to inspect. * @param {Array} array The array to inspect.

View File

@@ -6,7 +6,8 @@ define(['./_baseEach'], function(baseEach) {
* @private * @private
* @param {Array|Object} collection The collection to iterate over. * @param {Array|Object} collection The collection to iterate over.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if all elements pass the predicate check, else `false` * @returns {boolean} Returns `true` if all elements pass the predicate check,
* else `false`
*/ */
function baseEvery(collection, predicate) { function baseEvery(collection, predicate) {
var result = true; var result = true;

View File

@@ -9,7 +9,8 @@ define([], function() {
* @param {Array|Object} collection The collection to search. * @param {Array|Object} collection The collection to search.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @param {Function} eachFunc The function to iterate over `collection`. * @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. * @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`. * @returns {*} Returns the found element or its key, else `undefined`.
*/ */
function baseFind(collection, predicate, eachFunc, retKey) { function baseFind(collection, predicate, eachFunc, retKey) {

View File

@@ -1,10 +1,9 @@
define(['./_createBaseFor'], function(createBaseFor) { define(['./_createBaseFor'], function(createBaseFor) {
/** /**
* The base implementation of `baseForIn` and `baseForOwn` which iterates * The base implementation of `baseForOwn` which iterates over `object`
* over `object` properties returned by `keysFunc` invoking `iteratee` for * properties returned by `keysFunc` invoking `iteratee` for each property.
* each property. Iteratee functions may exit iteration early by explicitly * Iteratee functions may exit iteration early by explicitly returning `false`.
* returning `false`.
* *
* @private * @private
* @param {Object} object The object to iterate over. * @param {Object} object The object to iterate over.

View File

@@ -1,16 +0,0 @@
define(['./_baseFor', './keysIn'], function(baseFor, keysIn) {
/**
* The base implementation of `_.forIn` without support for iteratee shorthands.
*
* @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 object == null ? object : baseFor(object, iteratee, keysIn);
}
return baseForIn;
});

View File

@@ -12,7 +12,7 @@ define(['./_baseCastPath', './_isKey'], function(baseCastPath, isKey) {
* @returns {*} Returns the resolved value. * @returns {*} Returns the resolved value.
*/ */
function baseGet(object, path) { function baseGet(object, path) {
path = isKey(path, object) ? [path + ''] : baseCastPath(path); path = isKey(path, object) ? [path] : baseCastPath(path);
var index = 0, var index = 0,
length = path.length; length = path.length;

22
_baseGetAllKeys.js Normal file
View File

@@ -0,0 +1,22 @@
define(['./_arrayPush', './isArray'], function(arrayPush, isArray) {
/**
* The base implementation of `getAllKeys` and `getAllKeysIn` which uses
* `keysFunc` and `symbolsFunc` to get the enumerable property names and
* symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Function} keysFunc The function to get the keys of `object`.
* @param {Function} symbolsFunc The function to get the symbols of `object`.
* @returns {Array} Returns the array of property names and symbols.
*/
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
var result = keysFunc(object);
return isArray(object)
? result
: arrayPush(result, symbolsFunc(object));
}
return baseGetAllKeys;
});

View File

@@ -1,4 +1,4 @@
define([], function() { define(['./_getPrototype'], function(getPrototype) {
/** Used for built-in method references. */ /** Used for built-in method references. */
var objectProto = Object.prototype; var objectProto = Object.prototype;
@@ -6,9 +6,6 @@ define([], function() {
/** Used to check objects for own properties. */ /** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty; var hasOwnProperty = objectProto.hasOwnProperty;
/** Built-in value references. */
var getPrototypeOf = Object.getPrototypeOf;
/** /**
* The base implementation of `_.has` without support for deep paths. * The base implementation of `_.has` without support for deep paths.
* *
@@ -22,7 +19,7 @@ define([], function() {
// that are composed entirely of index properties, return `false` for // that are composed entirely of index properties, return `false` for
// `hasOwnProperty` checks of them. // `hasOwnProperty` checks of them.
return hasOwnProperty.call(object, key) || return hasOwnProperty.call(object, key) ||
(typeof object == 'object' && key in object && getPrototypeOf(object) === null); (typeof object == 'object' && key in object && getPrototype(object) === null);
} }
return baseHas; return baseHas;

View File

@@ -24,7 +24,8 @@ define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_ge
* @param {Object} other The other object to compare. * @param {Object} other The other object to compare.
* @param {Function} equalFunc The function to determine equivalents of values. * @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} [customizer] The function to customize comparisons. * @param {Function} [customizer] The function to customize comparisons.
* @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` for more details. * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`
* for more details.
* @param {Object} [stack] Tracks traversed `object` and `other` objects. * @param {Object} [stack] Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/ */
@@ -57,8 +58,11 @@ define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_ge
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
if (objIsWrapped || othIsWrapped) { if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object.value() : object,
othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack); stack || (stack = new Stack);
return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, bitmask, stack); return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);
} }
} }
if (!isSameTag) { if (!isSameTag) {

View File

@@ -46,9 +46,10 @@ define(['./_Stack', './_baseIsEqual'], function(Stack, baseIsEqual) {
return false; return false;
} }
} else { } else {
var stack = new Stack, var stack = new Stack;
result = customizer ? customizer(objValue, srcValue, key, object, source, stack) : undefined; if (customizer) {
var result = customizer(objValue, srcValue, key, object, source, stack);
}
if (!(result === undefined if (!(result === undefined
? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)
: result : result

View File

@@ -8,14 +8,15 @@ define(['./_baseMatches', './_baseMatchesProperty', './identity', './isArray', '
* @returns {Function} Returns the iteratee. * @returns {Function} Returns the iteratee.
*/ */
function baseIteratee(value) { function baseIteratee(value) {
var type = typeof value; // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
if (type == 'function') { // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
if (typeof value == 'function') {
return value; return value;
} }
if (value == null) { if (value == null) {
return identity; return identity;
} }
if (type == 'object') { if (typeof value == 'object') {
return isArray(value) return isArray(value)
? baseMatchesProperty(value[0], value[1]) ? baseMatchesProperty(value[0], value[1])
: baseMatches(value); : baseMatches(value);

View File

@@ -1,7 +1,7 @@
define([], function() { define([], function() {
/** /**
* The function whose prototype all chaining wrappers inherit from. * The function whose prototype chain sequence wrappers inherit from.
* *
* @private * @private
*/ */

View File

@@ -1,7 +1,4 @@
define(['./_baseIsMatch', './_getMatchData'], function(baseIsMatch, getMatchData) { define(['./_baseIsMatch', './_getMatchData', './_matchesStrictComparable'], function(baseIsMatch, getMatchData, matchesStrictComparable) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
/** /**
* The base implementation of `_.matches` which doesn't clone `source`. * The base implementation of `_.matches` which doesn't clone `source`.
@@ -13,16 +10,7 @@ define(['./_baseIsMatch', './_getMatchData'], function(baseIsMatch, getMatchData
function baseMatches(source) { function baseMatches(source) {
var matchData = getMatchData(source); var matchData = getMatchData(source);
if (matchData.length == 1 && matchData[0][2]) { if (matchData.length == 1 && matchData[0][2]) {
var key = matchData[0][0], return matchesStrictComparable(matchData[0][0], matchData[0][1]);
value = matchData[0][1];
return function(object) {
if (object == null) {
return false;
}
return object[key] === value &&
(value !== undefined || (key in Object(object)));
};
} }
return function(object) { return function(object) {
return object === source || baseIsMatch(object, source, matchData); return object === source || baseIsMatch(object, source, matchData);

View File

@@ -1,4 +1,4 @@
define(['./_baseIsEqual', './get', './hasIn'], function(baseIsEqual, get, hasIn) { define(['./_baseIsEqual', './get', './hasIn', './_isKey', './_isStrictComparable', './_matchesStrictComparable'], function(baseIsEqual, get, hasIn, isKey, isStrictComparable, matchesStrictComparable) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined; var undefined;
@@ -16,6 +16,9 @@ define(['./_baseIsEqual', './get', './hasIn'], function(baseIsEqual, get, hasIn)
* @returns {Function} Returns the new function. * @returns {Function} Returns the new function.
*/ */
function baseMatchesProperty(path, srcValue) { function baseMatchesProperty(path, srcValue) {
if (isKey(path) && isStrictComparable(srcValue)) {
return matchesStrictComparable(path, srcValue);
}
return function(object) { return function(object) {
var objValue = get(object, path); var objValue = get(object, path);
return (objValue === undefined && objValue === srcValue) return (objValue === undefined && objValue === srcValue)

21
_baseMean.js Normal file
View File

@@ -0,0 +1,21 @@
define(['./_baseSum'], function(baseSum) {
/** Used as references for various `Number` constants. */
var NAN = 0 / 0;
/**
* The base implementation of `_.mean` and `_.meanBy` without support for
* iteratee shorthands.
*
* @private
* @param {Array} array The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {number} Returns the mean.
*/
function baseMean(array, iteratee) {
var length = array ? array.length : 0;
return length ? (baseSum(array, iteratee) / length) : NAN;
}
return baseMean;
});

View File

@@ -11,16 +11,16 @@ define(['./_Stack', './_arrayEach', './_assignMergeValue', './_baseMergeDeep', '
* @param {Object} source The source object. * @param {Object} source The source object.
* @param {number} srcIndex The index of `source`. * @param {number} srcIndex The index of `source`.
* @param {Function} [customizer] The function to customize merged values. * @param {Function} [customizer] The function to customize merged values.
* @param {Object} [stack] Tracks traversed source values and their merged counterparts. * @param {Object} [stack] Tracks traversed source values and their merged
* counterparts.
*/ */
function baseMerge(object, source, srcIndex, customizer, stack) { function baseMerge(object, source, srcIndex, customizer, stack) {
if (object === source) { if (object === source) {
return; return;
} }
var props = (isArray(source) || isTypedArray(source)) if (!(isArray(source) || isTypedArray(source))) {
? undefined var props = keysIn(source);
: keysIn(source); }
arrayEach(props || source, function(srcValue, key) { arrayEach(props || source, function(srcValue, key) {
if (props) { if (props) {
key = srcValue; key = srcValue;

View File

@@ -15,7 +15,8 @@ define(['./_assignMergeValue', './_baseClone', './_copyArray', './isArguments',
* @param {number} srcIndex The index of `source`. * @param {number} srcIndex The index of `source`.
* @param {Function} mergeFunc The function to merge values. * @param {Function} mergeFunc The function to merge values.
* @param {Function} [customizer] The function to customize assigned values. * @param {Function} [customizer] The function to customize assigned values.
* @param {Object} [stack] Tracks traversed source values and their merged counterparts. * @param {Object} [stack] Tracks traversed source values and their merged
* counterparts.
*/ */
function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
var objValue = object[key], var objValue = object[key],
@@ -43,7 +44,7 @@ define(['./_assignMergeValue', './_baseClone', './_copyArray', './isArguments',
} }
else { else {
isCommon = false; isCommon = false;
newValue = baseClone(srcValue, !customizer); newValue = baseClone(srcValue, true);
} }
} }
else if (isPlainObject(srcValue) || isArguments(srcValue)) { else if (isPlainObject(srcValue) || isArguments(srcValue)) {
@@ -52,7 +53,7 @@ define(['./_assignMergeValue', './_baseClone', './_copyArray', './isArguments',
} }
else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
isCommon = false; isCommon = false;
newValue = baseClone(srcValue, !customizer); newValue = baseClone(srcValue, true);
} }
else { else {
newValue = objValue; newValue = objValue;

View File

@@ -1,4 +1,4 @@
define(['./_arrayMap', './_baseIteratee', './_baseMap', './_baseSortBy', './_compareMultiple'], function(arrayMap, baseIteratee, baseMap, baseSortBy, compareMultiple) { define(['./_arrayMap', './_baseIteratee', './_baseMap', './_baseSortBy', './_compareMultiple', './identity'], function(arrayMap, baseIteratee, baseMap, baseSortBy, compareMultiple, identity) {
/** /**
* The base implementation of `_.orderBy` without param guards. * The base implementation of `_.orderBy` without param guards.
@@ -11,7 +11,7 @@ define(['./_arrayMap', './_baseIteratee', './_baseMap', './_baseSortBy', './_com
*/ */
function baseOrderBy(collection, iteratees, orders) { function baseOrderBy(collection, iteratees, orders) {
var index = -1; var index = -1;
iteratees = arrayMap(iteratees.length ? iteratees : Array(1), baseIteratee); iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseIteratee);
var result = baseMap(collection, function(value, key, collection) { var result = baseMap(collection, function(value, key, collection) {
var criteria = arrayMap(iteratees, function(iteratee) { var criteria = arrayMap(iteratees, function(iteratee) {

View File

@@ -2,11 +2,11 @@ define(['./_arrayReduce'], function(arrayReduce) {
/** /**
* The base implementation of `_.pick` without support for individual * The base implementation of `_.pick` without support for individual
* property names. * property identifiers.
* *
* @private * @private
* @param {Object} object The source object. * @param {Object} object The source object.
* @param {string[]} props The property names to pick. * @param {string[]} props The property identifiers to pick.
* @returns {Object} Returns the new object. * @returns {Object} Returns the new object.
*/ */
function basePick(object, props) { function basePick(object, props) {

View File

@@ -1,4 +1,4 @@
define(['./_baseForIn'], function(baseForIn) { define(['./_getAllKeysIn'], function(getAllKeysIn) {
/** /**
* The base implementation of `_.pickBy` without support for iteratee shorthands. * The base implementation of `_.pickBy` without support for iteratee shorthands.
@@ -9,12 +9,19 @@ define(['./_baseForIn'], function(baseForIn) {
* @returns {Object} Returns the new object. * @returns {Object} Returns the new object.
*/ */
function basePickBy(object, predicate) { function basePickBy(object, predicate) {
var result = {}; var index = -1,
baseForIn(object, function(value, key) { props = getAllKeysIn(object),
length = props.length,
result = {};
while (++index < length) {
var key = props[index],
value = object[key];
if (predicate(value, key)) { if (predicate(value, key)) {
result[key] = value; result[key] = value;
} }
}); }
return result; return result;
} }

View File

@@ -8,7 +8,8 @@ define([], function() {
* @param {Array|Object} collection The collection to iterate over. * @param {Array|Object} collection The collection to iterate over.
* @param {Function} iteratee The function invoked per iteration. * @param {Function} iteratee The function invoked per iteration.
* @param {*} accumulator The initial value. * @param {*} accumulator The initial value.
* @param {boolean} initAccum Specify using the first or last element of `collection` as the initial value. * @param {boolean} initAccum Specify using the first or last element of
* `collection` as the initial value.
* @param {Function} eachFunc The function to iterate over `collection`. * @param {Function} eachFunc The function to iterate over `collection`.
* @returns {*} Returns the accumulated value. * @returns {*} Returns the accumulated value.
*/ */

38
_baseRepeat.js Normal file
View File

@@ -0,0 +1,38 @@
define([], function() {
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeFloor = Math.floor;
/**
* The base implementation of `_.repeat` which doesn't coerce arguments.
*
* @private
* @param {string} string The string to repeat.
* @param {number} n The number of times to repeat the string.
* @returns {string} Returns the repeated string.
*/
function baseRepeat(string, n) {
var result = '';
if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
return result;
}
// Leverage the exponentiation by squaring algorithm for a faster repeat.
// See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
do {
if (n % 2) {
result += string;
}
n = nativeFloor(n / 2);
if (n) {
string += string;
}
} while (n);
return result;
}
return baseRepeat;
});

View File

@@ -14,7 +14,7 @@ define(['./_assignValue', './_baseCastPath', './_isIndex', './_isKey', './isObje
* @returns {Object} Returns `object`. * @returns {Object} Returns `object`.
*/ */
function baseSet(object, path, value, customizer) { function baseSet(object, path, value, customizer) {
path = isKey(path, object) ? [path + ''] : baseCastPath(path); path = isKey(path, object) ? [path] : baseCastPath(path);
var index = -1, var index = -1,
length = path.length, length = path.length,

View File

@@ -6,7 +6,8 @@ define(['./_baseEach'], function(baseEach) {
* @private * @private
* @param {Array|Object} collection The collection to iterate over. * @param {Array|Object} collection The collection to iterate over.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if any element passes the predicate check, else `false`. * @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
*/ */
function baseSome(collection, predicate) { function baseSome(collection, predicate) {
var result; var result;

View File

@@ -21,7 +21,8 @@ define([], function() {
* @param {*} value The value to evaluate. * @param {*} value The value to evaluate.
* @param {Function} iteratee The iteratee invoked per element. * @param {Function} iteratee The iteratee invoked per element.
* @param {boolean} [retHighest] Specify returning the highest qualified index. * @param {boolean} [retHighest] Specify returning the highest qualified index.
* @returns {number} Returns the index at which `value` should be inserted into `array`. * @returns {number} Returns the index at which `value` should be inserted
* into `array`.
*/ */
function baseSortedIndexBy(array, value, iteratee, retHighest) { function baseSortedIndexBy(array, value, iteratee, retHighest) {
value = iteratee(value); value = iteratee(value);

View File

@@ -4,7 +4,8 @@ define([], function() {
var undefined; var undefined;
/** /**
* The base implementation of `_.sum` without support for iteratee shorthands. * The base implementation of `_.sum` and `_.sumBy` without support for
* iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} array The array to iterate over.

View File

@@ -9,7 +9,7 @@ define(['./_baseCastPath', './has', './_isKey', './last', './_parent'], function
* @returns {boolean} Returns `true` if the property is deleted, else `false`. * @returns {boolean} Returns `true` if the property is deleted, else `false`.
*/ */
function baseUnset(object, path) { function baseUnset(object, path) {
path = isKey(path, object) ? [path + ''] : baseCastPath(path); path = isKey(path, object) ? [path] : baseCastPath(path);
object = parent(object, path); object = parent(object, path);
var key = last(path); var key = last(path);
return (object != null && has(object, key)) ? delete object[key] : true; return (object != null && has(object, key)) ? delete object[key] : true;

View File

@@ -7,7 +7,7 @@ define([], function() {
* This base implementation of `_.zipObject` which assigns values using `assignFunc`. * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
* *
* @private * @private
* @param {Array} props The property names. * @param {Array} props The property identifiers.
* @param {Array} values The property values. * @param {Array} values The property values.
* @param {Function} assignFunc The function to assign values. * @param {Function} assignFunc The function to assign values.
* @returns {Object} Returns the new object. * @returns {Object} Returns the new object.
@@ -19,7 +19,8 @@ define([], function() {
result = {}; result = {};
while (++index < length) { while (++index < length) {
assignFunc(result, props[index], index < valsLength ? values[index] : undefined); var value = index < valsLength ? values[index] : undefined;
assignFunc(result, props[index], value);
} }
return result; return result;
} }

17
_cloneDataView.js Normal file
View File

@@ -0,0 +1,17 @@
define(['./_cloneArrayBuffer'], function(cloneArrayBuffer) {
/**
* Creates a clone of `dataView`.
*
* @private
* @param {Object} dataView The data view to clone.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the cloned data view.
*/
function cloneDataView(dataView, isDeep) {
var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
}
return cloneDataView;
});

View File

@@ -5,10 +5,13 @@ define(['./_addMapEntry', './_arrayReduce', './_mapToArray'], function(addMapEnt
* *
* @private * @private
* @param {Object} map The map to clone. * @param {Object} map The map to clone.
* @param {Function} cloneFunc The function to clone values.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the cloned map. * @returns {Object} Returns the cloned map.
*/ */
function cloneMap(map) { function cloneMap(map, isDeep, cloneFunc) {
return arrayReduce(mapToArray(map), addMapEntry, new map.constructor); var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);
return arrayReduce(array, addMapEntry, new map.constructor);
} }
return cloneMap; return cloneMap;

View File

@@ -5,10 +5,13 @@ define(['./_addSetEntry', './_arrayReduce', './_setToArray'], function(addSetEnt
* *
* @private * @private
* @param {Object} set The set to clone. * @param {Object} set The set to clone.
* @param {Function} cloneFunc The function to clone values.
* @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the cloned set. * @returns {Object} Returns the cloned set.
*/ */
function cloneSet(set) { function cloneSet(set, isDeep, cloneFunc) {
return arrayReduce(setToArray(set), addSetEntry, new set.constructor); var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);
return arrayReduce(array, addSetEntry, new set.constructor);
} }
return cloneSet; return cloneSet;

View File

@@ -37,7 +37,7 @@ define(['./_compareAscending'], function(compareAscending) {
// for more details. // for more details.
// //
// This also ensures a stable sort in V8 and other engines. // 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. // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
return object.index - other.index; return object.index - other.index;
} }

View File

@@ -5,7 +5,7 @@ define(['./_copyObjectWith'], function(copyObjectWith) {
* *
* @private * @private
* @param {Object} source The object to copy properties from. * @param {Object} source The object to copy properties from.
* @param {Array} props The property names to copy. * @param {Array} props The property identifiers to copy.
* @param {Object} [object={}] The object to copy properties to. * @param {Object} [object={}] The object to copy properties to.
* @returns {Object} Returns `object`. * @returns {Object} Returns `object`.
*/ */

View File

@@ -6,7 +6,7 @@ define(['./_assignValue'], function(assignValue) {
* *
* @private * @private
* @param {Object} source The object to copy properties from. * @param {Object} source The object to copy properties from.
* @param {Array} props The property names to copy. * @param {Array} props The property identifiers to copy.
* @param {Object} [object={}] The object to copy properties to. * @param {Object} [object={}] The object to copy properties to.
* @param {Function} [customizer] The function to customize copied values. * @param {Function} [customizer] The function to customize copied values.
* @returns {Object} Returns `object`. * @returns {Object} Returns `object`.

View File

@@ -1,7 +1,7 @@
define([], function() { define([], function() {
/** /**
* Creates a base function for methods like `_.forIn`. * Creates a base function for methods like `_.forIn` and `_.forOwn`.
* *
* @private * @private
* @param {boolean} [fromRight] Specify iterating from right to left. * @param {boolean} [fromRight] Specify iterating from right to left.

View File

@@ -9,7 +9,8 @@ define(['./_createCtorWrapper', './_root'], function(createCtorWrapper, root) {
* *
* @private * @private
* @param {Function} func The function to wrap. * @param {Function} func The function to wrap.
* @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper`
* for more details.
* @param {*} [thisArg] The `this` binding of `func`. * @param {*} [thisArg] The `this` binding of `func`.
* @returns {Function} Returns the new wrapped function. * @returns {Function} Returns the new wrapped function.
*/ */

View File

@@ -10,8 +10,8 @@ define(['./_baseCreate', './isObject'], function(baseCreate, isObject) {
*/ */
function createCtorWrapper(Ctor) { function createCtorWrapper(Ctor) {
return function() { return function() {
// Use a `switch` statement to work with class constructors. // Use a `switch` statement to work with class constructors. See
// See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist // http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
// for more details. // for more details.
var args = arguments; var args = arguments;
switch (args.length) { switch (args.length) {

View File

@@ -8,7 +8,8 @@ define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_create
* *
* @private * @private
* @param {Function} func The function to wrap. * @param {Function} func The function to wrap.
* @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper`
* for more details.
* @param {number} arity The arity of `func`. * @param {number} arity The arity of `func`.
* @returns {Function} Returns the new wrapped function. * @returns {Function} Returns the new wrapped function.
*/ */

View File

@@ -55,7 +55,9 @@ define(['./_LodashWrapper', './_baseFlatten', './_getData', './_getFuncName', '.
) { ) {
wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
} else { } else {
wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func); wrapper = (func.length == 1 && isLaziable(func))
? wrapper[funcName]()
: wrapper.thru(func);
} }
} }
return function() { return function() {

View File

@@ -17,11 +17,14 @@ define(['./_composeArgs', './_composeArgsRight', './_countHolders', './_createCt
* *
* @private * @private
* @param {Function|string} func The function or method name to wrap. * @param {Function|string} func The function or method name to wrap.
* @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper`
* for more details.
* @param {*} [thisArg] The `this` binding of `func`. * @param {*} [thisArg] The `this` binding of `func`.
* @param {Array} [partials] The arguments to prepend to those provided to the new function. * @param {Array} [partials] The arguments to prepend to those provided to
* the new function.
* @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [holders] The `partials` placeholder indexes.
* @param {Array} [partialsRight] The arguments to append to those provided to the new function. * @param {Array} [partialsRight] The arguments to append to those provided
* to the new function.
* @param {Array} [holdersRight] The `partialsRight` placeholder indexes. * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
* @param {Array} [argPos] The argument positions of the new function. * @param {Array} [argPos] The argument positions of the new function.
* @param {number} [ary] The arity cap of `func`. * @param {number} [ary] The arity cap of `func`.

30
_createMathOperation.js Normal file
View File

@@ -0,0 +1,30 @@
define([], function() {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
/**
* Creates a function that performs a mathematical operation on two values.
*
* @private
* @param {Function} operator The function to perform the operation.
* @returns {Function} Returns the new mathematical operation function.
*/
function createMathOperation(operator) {
return function(value, other) {
var result;
if (value === undefined && other === undefined) {
return 0;
}
if (value !== undefined) {
result = value;
}
if (other !== undefined) {
result = result === undefined ? other : operator(result, other);
}
return result;
};
}
return createMathOperation;
});

View File

@@ -1,4 +1,4 @@
define(['./repeat', './_stringSize', './_stringToArray', './toInteger'], function(repeat, stringSize, stringToArray, toInteger) { define(['./_baseRepeat', './_stringSize', './_stringToArray'], function(baseRepeat, stringSize, stringToArray) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined; var undefined;
@@ -23,25 +23,21 @@ define(['./repeat', './_stringSize', './_stringToArray', './toInteger'], functio
* is truncated if the number of characters exceeds `length`. * is truncated if the number of characters exceeds `length`.
* *
* @private * @private
* @param {string} string The string to create padding for. * @param {number} length The padding length.
* @param {number} [length=0] The padding length.
* @param {string} [chars=' '] The string used as padding. * @param {string} [chars=' '] The string used as padding.
* @returns {string} Returns the padding for `string`. * @returns {string} Returns the padding for `string`.
*/ */
function createPadding(string, length, chars) { function createPadding(length, chars) {
length = toInteger(length);
var strLength = stringSize(string);
if (!length || strLength >= length) {
return '';
}
var padLength = length - strLength;
chars = chars === undefined ? ' ' : (chars + ''); chars = chars === undefined ? ' ' : (chars + '');
var result = repeat(chars, nativeCeil(padLength / stringSize(chars))); var charsLength = chars.length;
if (charsLength < 2) {
return charsLength ? baseRepeat(chars, length) : chars;
}
var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
return reHasComplexSymbol.test(chars) return reHasComplexSymbol.test(chars)
? stringToArray(result).slice(0, padLength).join('') ? stringToArray(result).slice(0, length).join('')
: result.slice(0, padLength); : result.slice(0, length);
} }
return createPadding; return createPadding;

View File

@@ -4,15 +4,16 @@ define(['./_apply', './_createCtorWrapper', './_root'], function(apply, createCt
var BIND_FLAG = 1; var BIND_FLAG = 1;
/** /**
* Creates a function that wraps `func` to invoke it with the optional `this` * Creates a function that wraps `func` to invoke it with the `this` binding
* binding of `thisArg` and the `partials` prepended to those provided to * of `thisArg` and `partials` prepended to the arguments it receives.
* the wrapper.
* *
* @private * @private
* @param {Function} func The function to wrap. * @param {Function} func The function to wrap.
* @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper`
* for more details.
* @param {*} thisArg The `this` binding of `func`. * @param {*} thisArg The `this` binding of `func`.
* @param {Array} partials The arguments to prepend to those provided to the new function. * @param {Array} partials The arguments to prepend to those provided to
* the new function.
* @returns {Function} Returns the new wrapped function. * @returns {Function} Returns the new wrapped function.
*/ */
function createPartialWrapper(func, bitmask, thisArg, partials) { function createPartialWrapper(func, bitmask, thisArg, partials) {

View File

@@ -16,11 +16,13 @@ define(['./_copyArray', './_isLaziable', './_setData'], function(copyArray, isLa
* *
* @private * @private
* @param {Function} func The function to wrap. * @param {Function} func The function to wrap.
* @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper`
* for more details.
* @param {Function} wrapFunc The function to create the `func` wrapper. * @param {Function} wrapFunc The function to create the `func` wrapper.
* @param {*} placeholder The placeholder value. * @param {*} placeholder The placeholder value.
* @param {*} [thisArg] The `this` binding of `func`. * @param {*} [thisArg] The `this` binding of `func`.
* @param {Array} [partials] The arguments to prepend to those provided to the new function. * @param {Array} [partials] The arguments to prepend to those provided to
* the new function.
* @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [holders] The `partials` placeholder indexes.
* @param {Array} [argPos] The argument positions of the new function. * @param {Array} [argPos] The argument positions of the new function.
* @param {number} [ary] The arity cap of `func`. * @param {number} [ary] The arity cap of `func`.

View File

@@ -16,7 +16,8 @@ define(['./_arraySome'], function(arraySome) {
* @param {Array} other The other array to compare. * @param {Array} other The other array to compare.
* @param {Function} equalFunc The function to determine equivalents of values. * @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons. * @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details. * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
* for more details.
* @param {Object} stack Tracks traversed `array` and `other` objects. * @param {Object} stack Tracks traversed `array` and `other` objects.
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
*/ */
@@ -58,12 +59,16 @@ define(['./_arraySome'], function(arraySome) {
// Recursively compare arrays (susceptible to call stack limits). // Recursively compare arrays (susceptible to call stack limits).
if (isUnordered) { if (isUnordered) {
if (!arraySome(other, function(othValue) { if (!arraySome(other, function(othValue) {
return arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack); return arrValue === othValue ||
equalFunc(arrValue, othValue, customizer, bitmask, stack);
})) { })) {
result = false; result = false;
break; break;
} }
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { } else if (!(
arrValue === othValue ||
equalFunc(arrValue, othValue, customizer, bitmask, stack)
)) {
result = false; result = false;
break; break;
} }

View File

@@ -18,7 +18,8 @@ define(['./_Symbol', './_Uint8Array', './_equalArrays', './_mapToArray', './_set
stringTag = '[object String]', stringTag = '[object String]',
symbolTag = '[object Symbol]'; symbolTag = '[object Symbol]';
var arrayBufferTag = '[object ArrayBuffer]'; var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]';
/** Used to convert symbols to primitives and strings. */ /** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined, var symbolProto = Symbol ? Symbol.prototype : undefined,
@@ -37,12 +38,21 @@ define(['./_Symbol', './_Uint8Array', './_equalArrays', './_mapToArray', './_set
* @param {string} tag The `toStringTag` of the objects to compare. * @param {string} tag The `toStringTag` of the objects to compare.
* @param {Function} equalFunc The function to determine equivalents of values. * @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons. * @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details. * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
* for more details.
* @param {Object} stack Tracks traversed `object` and `other` objects. * @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/ */
function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
switch (tag) { switch (tag) {
case dataViewTag:
if ((object.byteLength != other.byteLength) ||
(object.byteOffset != other.byteOffset)) {
return false;
}
object = object.buffer;
other = other.buffer;
case arrayBufferTag: case arrayBufferTag:
if ((object.byteLength != other.byteLength) || if ((object.byteLength != other.byteLength) ||
!equalFunc(new Uint8Array(object), new Uint8Array(other))) { !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
@@ -52,8 +62,9 @@ define(['./_Symbol', './_Uint8Array', './_equalArrays', './_mapToArray', './_set
case boolTag: case boolTag:
case dateTag: case dateTag:
// Coerce dates and booleans to numbers, dates to milliseconds and booleans // Coerce dates and booleans to numbers, dates to milliseconds and
// to `1` or `0` treating invalid dates coerced to `NaN` as not equal. // booleans to `1` or `0` treating invalid dates coerced to `NaN` as
// not equal.
return +object == +other; return +object == +other;
case errorTag: case errorTag:
@@ -65,8 +76,9 @@ define(['./_Symbol', './_Uint8Array', './_equalArrays', './_mapToArray', './_set
case regexpTag: case regexpTag:
case stringTag: case stringTag:
// Coerce regexes to strings and treat strings primitives and string // Coerce regexes to strings and treat strings, primitives and objects,
// objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. // as equal. See http://www.ecma-international.org/ecma-262/6.0/#sec-regexp.prototype.tostring
// for more details.
return object == (other + ''); return object == (other + '');
case mapTag: case mapTag:
@@ -84,8 +96,11 @@ define(['./_Symbol', './_Uint8Array', './_equalArrays', './_mapToArray', './_set
if (stacked) { if (stacked) {
return stacked == other; return stacked == other;
} }
bitmask |= UNORDERED_COMPARE_FLAG;
stack.set(object, other);
// Recursively compare objects (susceptible to call stack limits). // Recursively compare objects (susceptible to call stack limits).
return equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask | UNORDERED_COMPARE_FLAG, stack.set(object, other)); return equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
case symbolTag: case symbolTag:
if (symbolValueOf) { if (symbolValueOf) {

View File

@@ -15,7 +15,8 @@ define(['./_baseHas', './keys'], function(baseHas, keys) {
* @param {Object} other The other object to compare. * @param {Object} other The other object to compare.
* @param {Function} equalFunc The function to determine equivalents of values. * @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} customizer The function to customize comparisons. * @param {Function} customizer The function to customize comparisons.
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` for more details. * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
* for more details.
* @param {Object} stack Tracks traversed `object` and `other` objects. * @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/ */

15
_getAllKeys.js Normal file
View File

@@ -0,0 +1,15 @@
define(['./_baseGetAllKeys', './_getSymbols', './keys'], function(baseGetAllKeys, getSymbols, keys) {
/**
* Creates an array of own enumerable property names and symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names and symbols.
*/
function getAllKeys(object) {
return baseGetAllKeys(object, keys, getSymbols);
}
return getAllKeys;
});

16
_getAllKeysIn.js Normal file
View File

@@ -0,0 +1,16 @@
define(['./_baseGetAllKeys', './_getSymbolsIn', './keysIn'], function(baseGetAllKeys, getSymbolsIn, keysIn) {
/**
* Creates an array of own and inherited enumerable property names and
* symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names and symbols.
*/
function getAllKeysIn(object) {
return baseGetAllKeys(object, keysIn, getSymbolsIn);
}
return getAllKeysIn;
});

View File

@@ -3,8 +3,9 @@ define(['./_baseProperty'], function(baseProperty) {
/** /**
* Gets the "length" property value of `object`. * Gets the "length" property value of `object`.
* *
* **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) * **Note:** This function is used to avoid a
* that affects Safari on at least iOS 8.1-8.3 ARM64. * [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) that affects
* Safari on at least iOS 8.1-8.3 ARM64.
* *
* @private * @private
* @param {Object} object The object to query. * @param {Object} object The object to query.

18
_getPrototype.js Normal file
View File

@@ -0,0 +1,18 @@
define([], function() {
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeGetPrototype = Object.getPrototypeOf;
/**
* Gets the `[[Prototype]]` of `value`.
*
* @private
* @param {*} value The value to query.
* @returns {null|Object} Returns the `[[Prototype]]`.
*/
function getPrototype(value) {
return nativeGetPrototype(Object(value));
}
return getPrototype;
});

View File

@@ -4,15 +4,24 @@ define([], function() {
var getOwnPropertySymbols = Object.getOwnPropertySymbols; var getOwnPropertySymbols = Object.getOwnPropertySymbols;
/** /**
* Creates an array of the own symbol properties of `object`. * Creates an array of the own enumerable symbol properties of `object`.
* *
* @private * @private
* @param {Object} object The object to query. * @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols. * @returns {Array} Returns the array of symbols.
*/ */
var getSymbols = getOwnPropertySymbols || function() { function getSymbols(object) {
return []; // Coerce `object` to an object to avoid non-object errors in V8.
}; // See https://bugs.chromium.org/p/v8/issues/detail?id=3443 for more details.
return getOwnPropertySymbols(Object(object));
}
// Fallback for IE < 11.
if (!getOwnPropertySymbols) {
getSymbols = function() {
return [];
};
}
return getSymbols; return getSymbols;
}); });

24
_getSymbolsIn.js Normal file
View File

@@ -0,0 +1,24 @@
define(['./_arrayPush', './_getPrototype', './_getSymbols'], function(arrayPush, getPrototype, getSymbols) {
/** Built-in value references. */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
/**
* Creates an array of the own and inherited enumerable symbol properties
* of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
var getSymbolsIn = !getOwnPropertySymbols ? getSymbols : function(object) {
var result = [];
while (object) {
arrayPush(result, getSymbols(object));
object = getPrototype(object);
}
return result;
};
return getSymbolsIn;
});

View File

@@ -1,27 +1,30 @@
define(['./_Map', './_Set', './_WeakMap'], function(Map, Set, WeakMap) { define(['./_DataView', './_Map', './_Promise', './_Set', './_WeakMap', './_toSource'], function(DataView, Map, Promise, Set, WeakMap, toSource) {
/** `Object#toString` result references. */ /** `Object#toString` result references. */
var mapTag = '[object Map]', var mapTag = '[object Map]',
objectTag = '[object Object]', objectTag = '[object Object]',
promiseTag = '[object Promise]',
setTag = '[object Set]', setTag = '[object Set]',
weakMapTag = '[object WeakMap]'; weakMapTag = '[object WeakMap]';
var dataViewTag = '[object DataView]';
/** Used for built-in method references. */ /** Used for built-in method references. */
var objectProto = Object.prototype; var objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = Function.prototype.toString;
/** /**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) * Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values. * of values.
*/ */
var objectToString = objectProto.toString; var objectToString = objectProto.toString;
/** Used to detect maps, sets, and weakmaps. */ /** Used to detect maps, sets, and weakmaps. */
var mapCtorString = Map ? funcToString.call(Map) : '', var dataViewCtorString = toSource(DataView),
setCtorString = Set ? funcToString.call(Set) : '', mapCtorString = toSource(Map),
weakMapCtorString = WeakMap ? funcToString.call(WeakMap) : ''; promiseCtorString = toSource(Promise),
setCtorString = toSource(Set),
weakMapCtorString = toSource(WeakMap);
/** /**
* Gets the `toStringTag` of `value`. * Gets the `toStringTag` of `value`.
@@ -34,18 +37,23 @@ define(['./_Map', './_Set', './_WeakMap'], function(Map, Set, WeakMap) {
return objectToString.call(value); return objectToString.call(value);
} }
// Fallback for IE 11 providing `toStringTag` values for maps, sets, and weakmaps. // Fallback for data views, maps, sets, and weak maps in IE 11,
if ((Map && getTag(new Map) != mapTag) || // for data views in Edge, and promises in Node.js.
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
(Map && getTag(new Map) != mapTag) ||
(Promise && getTag(Promise.resolve()) != promiseTag) ||
(Set && getTag(new Set) != setTag) || (Set && getTag(new Set) != setTag) ||
(WeakMap && getTag(new WeakMap) != weakMapTag)) { (WeakMap && getTag(new WeakMap) != weakMapTag)) {
getTag = function(value) { getTag = function(value) {
var result = objectToString.call(value), var result = objectToString.call(value),
Ctor = result == objectTag ? value.constructor : null, Ctor = result == objectTag ? value.constructor : null,
ctorString = typeof Ctor == 'function' ? funcToString.call(Ctor) : ''; ctorString = toSource(Ctor);
if (ctorString) { if (ctorString) {
switch (ctorString) { switch (ctorString) {
case dataViewCtorString: return dataViewTag;
case mapCtorString: return mapTag; case mapCtorString: return mapTag;
case promiseCtorString: return promiseTag;
case setCtorString: return setTag; case setCtorString: return setTag;
case weakMapCtorString: return weakMapTag; case weakMapCtorString: return weakMapTag;
} }

View File

@@ -1,7 +1,4 @@
define(['./_baseCastPath', './isArguments', './isArray', './_isIndex', './_isKey', './isLength', './isString', './last', './_parent'], function(baseCastPath, isArguments, isArray, isIndex, isKey, isLength, isString, last, parent) { define(['./_baseCastPath', './isArguments', './isArray', './_isIndex', './_isKey', './isLength', './isString'], function(baseCastPath, isArguments, isArray, isIndex, isKey, isLength, isString) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
/** /**
* Checks if `path` exists on `object`. * Checks if `path` exists on `object`.
@@ -13,23 +10,25 @@ define(['./_baseCastPath', './isArguments', './isArray', './_isIndex', './_isKey
* @returns {boolean} Returns `true` if `path` exists, else `false`. * @returns {boolean} Returns `true` if `path` exists, else `false`.
*/ */
function hasPath(object, path, hasFunc) { function hasPath(object, path, hasFunc) {
if (object == null) { path = isKey(path, object) ? [path] : baseCastPath(path);
return false;
} var result,
var result = hasFunc(object, path); index = -1,
if (!result && !isKey(path)) { length = path.length;
path = baseCastPath(path);
object = parent(object, path); while (++index < length) {
if (object != null) { var key = path[index];
path = last(path); if (!(result = object != null && hasFunc(object, key))) {
result = hasFunc(object, path); break;
} }
object = object[key];
} }
var length = object ? object.length : undefined; if (result) {
return result || ( return result;
!!length && isLength(length) && isIndex(path, length) && }
(isArray(object) || isString(object) || isArguments(object)) var length = object ? object.length : 0;
); return !!length && isLength(length) && isIndex(key, length) &&
(isArray(object) || isString(object) || isArguments(object));
} }
return hasPath; return hasPath;

View File

@@ -1,4 +1,4 @@
define(['./_cloneArrayBuffer', './_cloneMap', './_cloneRegExp', './_cloneSet', './_cloneSymbol', './_cloneTypedArray'], function(cloneArrayBuffer, cloneMap, cloneRegExp, cloneSet, cloneSymbol, cloneTypedArray) { define(['./_cloneArrayBuffer', './_cloneDataView', './_cloneMap', './_cloneRegExp', './_cloneSet', './_cloneSymbol', './_cloneTypedArray'], function(cloneArrayBuffer, cloneDataView, cloneMap, cloneRegExp, cloneSet, cloneSymbol, cloneTypedArray) {
/** `Object#toString` result references. */ /** `Object#toString` result references. */
var boolTag = '[object Boolean]', var boolTag = '[object Boolean]',
@@ -11,6 +11,7 @@ define(['./_cloneArrayBuffer', './_cloneMap', './_cloneRegExp', './_cloneSet', '
symbolTag = '[object Symbol]'; symbolTag = '[object Symbol]';
var arrayBufferTag = '[object ArrayBuffer]', var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]', float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]', float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]', int8Tag = '[object Int8Array]',
@@ -30,10 +31,11 @@ define(['./_cloneArrayBuffer', './_cloneMap', './_cloneRegExp', './_cloneSet', '
* @private * @private
* @param {Object} object The object to clone. * @param {Object} object The object to clone.
* @param {string} tag The `toStringTag` of the object to clone. * @param {string} tag The `toStringTag` of the object to clone.
* @param {Function} cloneFunc The function to clone values.
* @param {boolean} [isDeep] Specify a deep clone. * @param {boolean} [isDeep] Specify a deep clone.
* @returns {Object} Returns the initialized clone. * @returns {Object} Returns the initialized clone.
*/ */
function initCloneByTag(object, tag, isDeep) { function initCloneByTag(object, tag, cloneFunc, isDeep) {
var Ctor = object.constructor; var Ctor = object.constructor;
switch (tag) { switch (tag) {
case arrayBufferTag: case arrayBufferTag:
@@ -43,13 +45,16 @@ define(['./_cloneArrayBuffer', './_cloneMap', './_cloneRegExp', './_cloneSet', '
case dateTag: case dateTag:
return new Ctor(+object); return new Ctor(+object);
case dataViewTag:
return cloneDataView(object, isDeep);
case float32Tag: case float64Tag: case float32Tag: case float64Tag:
case int8Tag: case int16Tag: case int32Tag: case int8Tag: case int16Tag: case int32Tag:
case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
return cloneTypedArray(object, isDeep); return cloneTypedArray(object, isDeep);
case mapTag: case mapTag:
return cloneMap(object); return cloneMap(object, isDeep, cloneFunc);
case numberTag: case numberTag:
case stringTag: case stringTag:
@@ -59,7 +64,7 @@ define(['./_cloneArrayBuffer', './_cloneMap', './_cloneRegExp', './_cloneSet', '
return cloneRegExp(object); return cloneRegExp(object);
case setTag: case setTag:
return cloneSet(object); return cloneSet(object, isDeep, cloneFunc);
case symbolTag: case symbolTag:
return cloneSymbol(object); return cloneSymbol(object);

View File

@@ -1,7 +1,4 @@
define(['./_baseCreate', './_isPrototype'], function(baseCreate, isPrototype) { define(['./_baseCreate', './_getPrototype', './_isPrototype'], function(baseCreate, getPrototype, isPrototype) {
/** Built-in value references. */
var getPrototypeOf = Object.getPrototypeOf;
/** /**
* Initializes an object clone. * Initializes an object clone.
@@ -12,7 +9,7 @@ define(['./_baseCreate', './_isPrototype'], function(baseCreate, isPrototype) {
*/ */
function initCloneObject(object) { function initCloneObject(object) {
return (typeof object.constructor == 'function' && !isPrototype(object)) return (typeof object.constructor == 'function' && !isPrototype(object))
? baseCreate(getPrototypeOf(object)) ? baseCreate(getPrototype(object))
: {}; : {};
} }

View File

@@ -7,7 +7,8 @@ define(['./eq', './isArrayLike', './_isIndex', './isObject'], function(eq, isArr
* @param {*} value The potential iteratee value argument. * @param {*} value The potential iteratee value argument.
* @param {*} index The potential iteratee index or key argument. * @param {*} index The potential iteratee index or key argument.
* @param {*} object The potential iteratee object argument. * @param {*} object The potential iteratee object argument.
* @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
* else `false`.
*/ */
function isIterateeCall(value, index, object) { function isIterateeCall(value, index, object) {
if (!isObject(object)) { if (!isObject(object)) {
@@ -15,8 +16,9 @@ define(['./eq', './isArrayLike', './_isIndex', './isObject'], function(eq, isArr
} }
var type = typeof index; var type = typeof index;
if (type == 'number' if (type == 'number'
? (isArrayLike(object) && isIndex(index, object.length)) ? (isArrayLike(object) && isIndex(index, object.length))
: (type == 'string' && index in object)) { : (type == 'string' && index in object)
) {
return eq(object[index], value); return eq(object[index], value);
} }
return false; return false;

View File

@@ -1,4 +1,4 @@
define(['./isArray'], function(isArray) { define(['./isArray', './isSymbol'], function(isArray, isSymbol) {
/** Used to match property names within property paths. */ /** Used to match property names within property paths. */
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
@@ -13,11 +13,12 @@ define(['./isArray'], function(isArray) {
* @returns {boolean} Returns `true` if `value` is a property name, else `false`. * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
*/ */
function isKey(value, object) { function isKey(value, object) {
if (typeof value == 'number') { var type = typeof value;
if (type == 'number' || type == 'symbol') {
return true; return true;
} }
return !isArray(value) && return !isArray(value) &&
(reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (isSymbol(value) || reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
(object != null && value in Object(object))); (object != null && value in Object(object)));
} }

View File

@@ -5,7 +5,8 @@ define(['./_LazyWrapper', './_getData', './_getFuncName', './wrapperLodash'], fu
* *
* @private * @private
* @param {Function} func The function to check. * @param {Function} func The function to check.
* @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`. * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
* else `false`.
*/ */
function isLaziable(func) { function isLaziable(func) {
var funcName = getFuncName(func), var funcName = getFuncName(func),

View File

@@ -8,7 +8,7 @@ define(['./_Map', './_assocSet', './_hashSet', './_isKeyable'], function(Map, as
* @memberOf MapCache * @memberOf MapCache
* @param {string} key The key of the value to set. * @param {string} key The key of the value to set.
* @param {*} value The value to set. * @param {*} value The value to set.
* @returns {Object} Returns the map cache object. * @returns {Object} Returns the map cache instance.
*/ */
function mapSet(key, value) { function mapSet(key, value) {
var data = this.__data__; var data = this.__data__;

View File

@@ -0,0 +1,26 @@
define([], function() {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
/**
* A specialized version of `matchesProperty` for source values suitable
* for strict equality comparisons, i.e. `===`.
*
* @private
* @param {string} key The key of the property to get.
* @param {*} srcValue The value to match.
* @returns {Function} Returns the new function.
*/
function matchesStrictComparable(key, srcValue) {
return function(object) {
if (object == null) {
return false;
}
return object[key] === srcValue &&
(srcValue !== undefined || (key in Object(object)));
};
}
return matchesStrictComparable;
});

View File

@@ -19,10 +19,11 @@ define(['./_composeArgs', './_composeArgsRight', './_copyArray', './_replaceHold
* *
* Merging metadata reduces the number of wrappers used to invoke a function. * Merging metadata reduces the number of wrappers used to invoke a function.
* This is possible because methods like `_.bind`, `_.curry`, and `_.partial` * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
* may be applied regardless of execution order. Methods like `_.ary` and `_.rearg` * may be applied regardless of execution order. Methods like `_.ary` and
* modify function arguments, making the order in which they are executed important, * `_.rearg` modify function arguments, making the order in which they are
* preventing the merging of metadata. However, we make an exception for a safe * executed important, preventing the merging of metadata. However, we make
* combined case where curried functions have `_.ary` and or `_.rearg` applied. * an exception for a safe combined case where curried functions have `_.ary`
* and or `_.rearg` applied.
* *
* @private * @private
* @param {Array} data The destination metadata. * @param {Array} data The destination metadata.

View File

@@ -12,7 +12,8 @@ define(['./_baseMerge', './isObject'], function(baseMerge, isObject) {
* @param {string} key The key of the property to merge. * @param {string} key The key of the property to merge.
* @param {Object} object The parent object of `objValue`. * @param {Object} object The parent object of `objValue`.
* @param {Object} source The parent object of `srcValue`. * @param {Object} source The parent object of `srcValue`.
* @param {Object} [stack] Tracks traversed source values and their merged counterparts. * @param {Object} [stack] Tracks traversed source values and their merged
* counterparts.
* @returns {*} Returns the value to assign. * @returns {*} Returns the value to assign.
*/ */
function mergeDefaults(objValue, srcValue, key, object, source, stack) { function mergeDefaults(objValue, srcValue, key, object, source, stack) {

View File

@@ -1,4 +1,4 @@
define(['./_baseSlice', './get'], function(baseSlice, get) { define(['./_baseGet', './_baseSlice'], function(baseGet, baseSlice) {
/** /**
* Gets the parent value at `path` of `object`. * Gets the parent value at `path` of `object`.
@@ -9,7 +9,7 @@ define(['./_baseSlice', './get'], function(baseSlice, get) {
* @returns {*} Returns the parent value. * @returns {*} Returns the parent value.
*/ */
function parent(object, path) { function parent(object, path) {
return path.length == 1 ? object : get(object, baseSlice(path, 0, -1)); return path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
} }
return parent; return parent;

View File

@@ -8,8 +8,9 @@ define(['./_baseSetData', './now'], function(baseSetData, now) {
* Sets metadata for `func`. * Sets metadata for `func`.
* *
* **Note:** If this function becomes hot, i.e. is invoked a lot in a short * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
* period of time, it will trip its breaker and transition to an identity function * period of time, it will trip its breaker and transition to an identity
* to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070) * function to avoid garbage collection pauses in V8. See
* [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
* for more details. * for more details.
* *
* @private * @private

View File

@@ -11,7 +11,7 @@ define(['./_MapCache', './_assocSet'], function(MapCache, assocSet) {
* @memberOf Stack * @memberOf Stack
* @param {string} key The key of the value to set. * @param {string} key The key of the value to set.
* @param {*} value The value to set. * @param {*} value The value to set.
* @returns {Object} Returns the stack cache object. * @returns {Object} Returns the stack cache instance.
*/ */
function stackSet(key, value) { function stackSet(key, value) {
var data = this.__data__, var data = this.__data__,

View File

@@ -1,4 +1,4 @@
define(['./toString'], function(toString) { define(['./memoize', './toString'], function(memoize, toString) {
/** Used to match property names within property paths. */ /** Used to match property names within property paths. */
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g; var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g;
@@ -13,13 +13,13 @@ define(['./toString'], function(toString) {
* @param {string} string The string to convert. * @param {string} string The string to convert.
* @returns {Array} Returns the property path array. * @returns {Array} Returns the property path array.
*/ */
function stringToPath(string) { var stringToPath = memoize(function(string) {
var result = []; var result = [];
toString(string).replace(rePropName, function(match, number, quote, string) { toString(string).replace(rePropName, function(match, number, quote, string) {
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
}); });
return result; return result;
} });
return stringToPath; return stringToPath;
}); });

23
_toSource.js Normal file
View File

@@ -0,0 +1,23 @@
define(['./isFunction', './toString'], function(isFunction, toString) {
/** Used to resolve the decompiled source of functions. */
var funcToString = Function.prototype.toString;
/**
* Converts `func` to its source code.
*
* @private
* @param {Function} func The function to process.
* @returns {string} Returns the source code.
*/
function toSource(func) {
if (isFunction(func)) {
try {
return funcToString.call(func);
} catch (e) {}
}
return toString(func);
}
return toSource;
});

22
add.js
View File

@@ -1,13 +1,11 @@
define([], function() { define(['./_createMathOperation'], function(createMathOperation) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
/** /**
* Adds two numbers. * Adds two numbers.
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 3.4.0
* @category Math * @category Math
* @param {number} augend The first number in an addition. * @param {number} augend The first number in an addition.
* @param {number} addend The second number in an addition. * @param {number} addend The second number in an addition.
@@ -17,19 +15,9 @@ define([], function() {
* _.add(6, 4); * _.add(6, 4);
* // => 10 * // => 10
*/ */
function add(augend, addend) { var add = createMathOperation(function(augend, addend) {
var result; return augend + addend;
if (augend === undefined && addend === undefined) { });
return 0;
}
if (augend !== undefined) {
result = augend;
}
if (addend !== undefined) {
result = result === undefined ? addend : (result + addend);
}
return result;
}
return add; return add;
}); });

View File

@@ -9,6 +9,7 @@ define(['./toInteger'], function(toInteger) {
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 0.1.0
* @category Function * @category Function
* @param {number} n The number of calls before `func` is invoked. * @param {number} n The number of calls before `func` is invoked.
* @param {Function} func The function to restrict. * @param {Function} func The function to restrict.
@@ -24,7 +25,7 @@ define(['./toInteger'], function(toInteger) {
* _.forEach(saves, function(type) { * _.forEach(saves, function(type) {
* asyncSave({ 'type': type, 'complete': done }); * asyncSave({ 'type': type, 'complete': done });
* }); * });
* // => logs 'done saving!' after the two async saves have completed * // => Logs 'done saving!' after the two async saves have completed.
*/ */
function after(n, func) { function after(n, func) {
if (typeof func != 'function') { if (typeof func != 'function') {

7
ary.js
View File

@@ -7,15 +7,16 @@ define(['./_createWrapper'], function(createWrapper) {
var ARY_FLAG = 128; var ARY_FLAG = 128;
/** /**
* Creates a function that accepts up to `n` arguments, ignoring any * Creates a function that invokes `func`, with up to `n` arguments,
* additional arguments. * ignoring any additional arguments.
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 3.0.0
* @category Function * @category Function
* @param {Function} func The function to cap arguments for. * @param {Function} func The function to cap arguments for.
* @param {number} [n=func.length] The arity cap. * @param {number} [n=func.length] The arity cap.
* @param- {Object} [guard] Enables use as an iteratee for functions like `_.map`. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
* @returns {Function} Returns the new function. * @returns {Function} Returns the new function.
* @example * @example
* *

View File

@@ -13,15 +13,16 @@ define(['./_assignValue', './_copyObject', './_createAssigner', './isArrayLike',
var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf'); var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');
/** /**
* Assigns own enumerable properties of source objects to the destination * Assigns own enumerable string keyed properties of source objects to the
* object. Source objects are applied from left to right. Subsequent sources * destination object. Source objects are applied from left to right.
* overwrite property assignments of previous sources. * Subsequent sources overwrite property assignments of previous sources.
* *
* **Note:** This method mutates `object` and is loosely based on * **Note:** This method mutates `object` and is loosely based on
* [`Object.assign`](https://mdn.io/Object/assign). * [`Object.assign`](https://mdn.io/Object/assign).
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 0.10.0
* @category Object * @category Object
* @param {Object} object The destination object. * @param {Object} object The destination object.
* @param {...Object} [sources] The source objects. * @param {...Object} [sources] The source objects.

View File

@@ -17,6 +17,7 @@ define(['./_assignValue', './_copyObject', './_createAssigner', './isArrayLike',
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 4.0.0
* @alias extend * @alias extend
* @category Object * @category Object
* @param {Object} object The destination object. * @param {Object} object The destination object.

View File

@@ -1,15 +1,16 @@
define(['./_copyObjectWith', './_createAssigner', './keysIn'], function(copyObjectWith, createAssigner, keysIn) { define(['./_copyObjectWith', './_createAssigner', './keysIn'], function(copyObjectWith, createAssigner, keysIn) {
/** /**
* This method is like `_.assignIn` except that it accepts `customizer` which * This method is like `_.assignIn` except that it accepts `customizer`
* is invoked to produce the assigned values. If `customizer` returns `undefined` * which is invoked to produce the assigned values. If `customizer` returns
* assignment is handled by the method instead. The `customizer` is invoked * `undefined` assignment is handled by the method instead. The `customizer`
* with five arguments: (objValue, srcValue, key, object, source). * is invoked with five arguments: (objValue, srcValue, key, object, source).
* *
* **Note:** This method mutates `object`. * **Note:** This method mutates `object`.
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 4.0.0
* @alias extendWith * @alias extendWith
* @category Object * @category Object
* @param {Object} object The destination object. * @param {Object} object The destination object.

View File

@@ -1,15 +1,16 @@
define(['./_copyObjectWith', './_createAssigner', './keys'], function(copyObjectWith, createAssigner, keys) { define(['./_copyObjectWith', './_createAssigner', './keys'], function(copyObjectWith, createAssigner, keys) {
/** /**
* This method is like `_.assign` except that it accepts `customizer` which * This method is like `_.assign` except that it accepts `customizer`
* is invoked to produce the assigned values. If `customizer` returns `undefined` * which is invoked to produce the assigned values. If `customizer` returns
* assignment is handled by the method instead. The `customizer` is invoked * `undefined` assignment is handled by the method instead. The `customizer`
* with five arguments: (objValue, srcValue, key, object, source). * is invoked with five arguments: (objValue, srcValue, key, object, source).
* *
* **Note:** This method mutates `object`. * **Note:** This method mutates `object`.
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 4.0.0
* @category Object * @category Object
* @param {Object} object The destination object. * @param {Object} object The destination object.
* @param {...Object} sources The source objects. * @param {...Object} sources The source objects.

1
at.js
View File

@@ -5,6 +5,7 @@ define(['./_baseAt', './_baseFlatten', './rest'], function(baseAt, baseFlatten,
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 1.0.0
* @category Object * @category Object
* @param {Object} object The object to iterate over. * @param {Object} object The object to iterate over.
* @param {...(string|string[])} [paths] The property paths of elements to pick, * @param {...(string|string[])} [paths] The property paths of elements to pick,

View File

@@ -9,8 +9,10 @@ define(['./_apply', './isError', './rest'], function(apply, isError, rest) {
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 3.0.0
* @category Util * @category Util
* @param {Function} func The function to attempt. * @param {Function} func The function to attempt.
* @param {...*} [args] The arguments to invoke `func` with.
* @returns {*} Returns the `func` result or error object. * @returns {*} Returns the `func` result or error object.
* @example * @example
* *

View File

@@ -13,6 +13,7 @@ define(['./toInteger'], function(toInteger) {
* *
* @static * @static
* @memberOf _ * @memberOf _
* @since 3.0.0
* @category Function * @category Function
* @param {number} n The number of calls at which `func` is no longer invoked. * @param {number} n The number of calls at which `func` is no longer invoked.
* @param {Function} func The function to restrict. * @param {Function} func The function to restrict.

Some files were not shown because too many files have changed in this diff Show More