diff --git a/README.md b/README.md
index 59cc860c8..2865b8d41 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# lodash v4.13.1
+# lodash v4.14.0
The [Lodash](https://lodash.com/) library exported as [Node.js](https://nodejs.org/) modules.
@@ -28,7 +28,7 @@ var chunk = require('lodash/chunk');
var extend = require('lodash/fp/extend');
```
-See the [package source](https://github.com/lodash/lodash/tree/4.13.1-npm) for more details.
+See the [package source](https://github.com/lodash/lodash/tree/4.14.0-npm) for more details.
**Note:**
Don’t assign values to the [special variable](http://nodejs.org/api/repl.html#repl_repl_features) `_` in the Node.js < 6 REPL.
@@ -36,5 +36,5 @@ Install [n_](https://www.npmjs.com/package/n_) for a REPL that includes `lodash`
## Support
-Tested in Chrome 49-50, Firefox 45-46, IE 9-11, Edge 13, Safari 8-9, Node.js 0.10-6, & PhantomJS 1.9.8.
+Tested in Chrome 50-51, Firefox 46-47, IE 9-11, Edge 13, Safari 8-9, Node.js 0.10-6, & PhantomJS 1.9.8.
Automated [browser](https://saucelabs.com/u/lodash) & [CI](https://travis-ci.org/lodash/lodash/) test runs are available.
diff --git a/_addMapEntry.js b/_addMapEntry.js
index 0112ef744..5a6921216 100644
--- a/_addMapEntry.js
+++ b/_addMapEntry.js
@@ -7,7 +7,7 @@
* @returns {Object} Returns `map`.
*/
function addMapEntry(map, pair) {
- // Don't return `Map#set` because it doesn't return the map instance in IE 11.
+ // Don't return `map.set` because it's not chainable in IE 11.
map.set(pair[0], pair[1]);
return map;
}
diff --git a/_addSetEntry.js b/_addSetEntry.js
index 7b75c13f6..1a07b708a 100644
--- a/_addSetEntry.js
+++ b/_addSetEntry.js
@@ -7,6 +7,7 @@
* @returns {Object} Returns `set`.
*/
function addSetEntry(set, value) {
+ // Don't return `set.add` because it's not chainable in IE 11.
set.add(value);
return set;
}
diff --git a/_apply.js b/_apply.js
index d000f0460..36436dda5 100644
--- a/_apply.js
+++ b/_apply.js
@@ -9,8 +9,7 @@
* @returns {*} Returns the result of `func`.
*/
function apply(func, thisArg, args) {
- var length = args.length;
- switch (length) {
+ switch (args.length) {
case 0: return func.call(thisArg);
case 1: return func.call(thisArg, args[0]);
case 2: return func.call(thisArg, args[0], args[1]);
diff --git a/_baseClamp.js b/_baseClamp.js
index ceadeef1c..a1c569292 100644
--- a/_baseClamp.js
+++ b/_baseClamp.js
@@ -1,5 +1,5 @@
/**
- * The base implementation of `_.clamp` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.clamp` which doesn't coerce arguments.
*
* @private
* @param {number} number The number to clamp.
diff --git a/_baseClone.js b/_baseClone.js
index b1079edd8..c2c657319 100644
--- a/_baseClone.js
+++ b/_baseClone.js
@@ -125,14 +125,17 @@ function baseClone(value, isDeep, isFull, customizer, key, object, stack) {
if (!isArr) {
var props = isFull ? getAllKeys(value) : keys(value);
}
- // Recursively populate clone (susceptible to call stack limits).
arrayEach(props || value, function(subValue, key) {
if (props) {
key = subValue;
subValue = value[key];
}
+ // Recursively populate clone (susceptible to call stack limits).
assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
});
+ if (!isFull) {
+ stack['delete'](value);
+ }
return result;
}
diff --git a/_baseConforms.js b/_baseConforms.js
index 396727c42..947e20d40 100644
--- a/_baseConforms.js
+++ b/_baseConforms.js
@@ -1,4 +1,5 @@
-var keys = require('./keys');
+var baseConformsTo = require('./_baseConformsTo'),
+ keys = require('./keys');
/**
* The base implementation of `_.conforms` which doesn't clone `source`.
@@ -8,25 +9,9 @@ var keys = require('./keys');
* @returns {Function} Returns the new spec function.
*/
function baseConforms(source) {
- var props = keys(source),
- length = props.length;
-
+ var props = keys(source);
return function(object) {
- if (object == null) {
- return !length;
- }
- var index = length;
- while (index--) {
- var key = props[index],
- predicate = source[key],
- value = object[key];
-
- if ((value === undefined &&
- !(key in Object(object))) || !predicate(value)) {
- return false;
- }
- }
- return true;
+ return baseConformsTo(object, source, props);
};
}
diff --git a/_baseConformsTo.js b/_baseConformsTo.js
new file mode 100644
index 000000000..a72deda2d
--- /dev/null
+++ b/_baseConformsTo.js
@@ -0,0 +1,28 @@
+/**
+ * The base implementation of `_.conformsTo` which accepts `props` to check.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+ */
+function baseConformsTo(object, source, props) {
+ var length = props.length;
+ if (object == null) {
+ return !length;
+ }
+ var index = length;
+ while (index--) {
+ var key = props[index],
+ predicate = source[key],
+ value = object[key];
+
+ if ((value === undefined &&
+ !(key in Object(object))) || !predicate(value)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+module.exports = baseConformsTo;
diff --git a/_baseDelay.js b/_baseDelay.js
index c39756257..1e4e69b68 100644
--- a/_baseDelay.js
+++ b/_baseDelay.js
@@ -2,13 +2,13 @@
var FUNC_ERROR_TEXT = 'Expected a function';
/**
- * The base implementation of `_.delay` and `_.defer` which accepts an array
- * of `func` arguments.
+ * The base implementation of `_.delay` and `_.defer` which accepts `args`
+ * to provide to `func`.
*
* @private
* @param {Function} func The function to delay.
* @param {number} wait The number of milliseconds to delay invocation.
- * @param {Object} args The arguments to provide to `func`.
+ * @param {Array} args The arguments to provide to `func`.
* @returns {number} Returns the timer id.
*/
function baseDelay(func, wait, args) {
diff --git a/_baseGetTag.js b/_baseGetTag.js
new file mode 100644
index 000000000..ce773623c
--- /dev/null
+++ b/_baseGetTag.js
@@ -0,0 +1,22 @@
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/**
+ * The base implementation of `getTag`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+function baseGetTag(value) {
+ return objectToString.call(value);
+}
+
+module.exports = baseGetTag;
diff --git a/_baseGt.js b/_baseGt.js
index 813238b97..502d273ca 100644
--- a/_baseGt.js
+++ b/_baseGt.js
@@ -1,5 +1,5 @@
/**
- * The base implementation of `_.gt` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.gt` which doesn't coerce arguments.
*
* @private
* @param {*} value The value to compare.
diff --git a/_baseInRange.js b/_baseInRange.js
index 16d53f2d3..ec9566618 100644
--- a/_baseInRange.js
+++ b/_baseInRange.js
@@ -3,7 +3,7 @@ var nativeMax = Math.max,
nativeMin = Math.min;
/**
- * The base implementation of `_.inRange` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.inRange` which doesn't coerce arguments.
*
* @private
* @param {number} number The number to check.
diff --git a/_baseIndexOf.js b/_baseIndexOf.js
index 6cda8023c..94d228996 100644
--- a/_baseIndexOf.js
+++ b/_baseIndexOf.js
@@ -1,4 +1,5 @@
-var indexOfNaN = require('./_indexOfNaN');
+var baseFindIndex = require('./_baseFindIndex'),
+ baseIsNaN = require('./_baseIsNaN');
/**
* The base implementation of `_.indexOf` without `fromIndex` bounds checks.
@@ -11,7 +12,7 @@ var indexOfNaN = require('./_indexOfNaN');
*/
function baseIndexOf(array, value, fromIndex) {
if (value !== value) {
- return indexOfNaN(array, fromIndex);
+ return baseFindIndex(array, baseIsNaN, fromIndex);
}
var index = fromIndex - 1,
length = array.length;
diff --git a/_baseIsArrayBuffer.js b/_baseIsArrayBuffer.js
new file mode 100644
index 000000000..a380bf7b2
--- /dev/null
+++ b/_baseIsArrayBuffer.js
@@ -0,0 +1,26 @@
+var isObjectLike = require('./isObjectLike');
+
+var arrayBufferTag = '[object ArrayBuffer]';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/**
+ * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+ */
+function baseIsArrayBuffer(value) {
+ return isObjectLike(value) && objectToString.call(value) == arrayBufferTag;
+}
+
+module.exports = baseIsArrayBuffer;
diff --git a/_baseIsDate.js b/_baseIsDate.js
new file mode 100644
index 000000000..01b7c72d4
--- /dev/null
+++ b/_baseIsDate.js
@@ -0,0 +1,27 @@
+var isObjectLike = require('./isObjectLike');
+
+/** `Object#toString` result references. */
+var dateTag = '[object Date]';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/**
+ * The base implementation of `_.isDate` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+ */
+function baseIsDate(value) {
+ return isObjectLike(value) && objectToString.call(value) == dateTag;
+}
+
+module.exports = baseIsDate;
diff --git a/_baseIsMap.js b/_baseIsMap.js
new file mode 100644
index 000000000..02a4021ca
--- /dev/null
+++ b/_baseIsMap.js
@@ -0,0 +1,18 @@
+var getTag = require('./_getTag'),
+ isObjectLike = require('./isObjectLike');
+
+/** `Object#toString` result references. */
+var mapTag = '[object Map]';
+
+/**
+ * The base implementation of `_.isMap` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+ */
+function baseIsMap(value) {
+ return isObjectLike(value) && getTag(value) == mapTag;
+}
+
+module.exports = baseIsMap;
diff --git a/_baseIsNaN.js b/_baseIsNaN.js
new file mode 100644
index 000000000..316f1eb1e
--- /dev/null
+++ b/_baseIsNaN.js
@@ -0,0 +1,12 @@
+/**
+ * The base implementation of `_.isNaN` without support for number objects.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+ */
+function baseIsNaN(value) {
+ return value !== value;
+}
+
+module.exports = baseIsNaN;
diff --git a/_baseIsRegExp.js b/_baseIsRegExp.js
new file mode 100644
index 000000000..6d10b42de
--- /dev/null
+++ b/_baseIsRegExp.js
@@ -0,0 +1,27 @@
+var isObject = require('./isObject');
+
+/** `Object#toString` result references. */
+var regexpTag = '[object RegExp]';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/**
+ * The base implementation of `_.isRegExp` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+ */
+function baseIsRegExp(value) {
+ return isObject(value) && objectToString.call(value) == regexpTag;
+}
+
+module.exports = baseIsRegExp;
diff --git a/_baseIsSet.js b/_baseIsSet.js
new file mode 100644
index 000000000..6dee36716
--- /dev/null
+++ b/_baseIsSet.js
@@ -0,0 +1,18 @@
+var getTag = require('./_getTag'),
+ isObjectLike = require('./isObjectLike');
+
+/** `Object#toString` result references. */
+var setTag = '[object Set]';
+
+/**
+ * The base implementation of `_.isSet` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+ */
+function baseIsSet(value) {
+ return isObjectLike(value) && getTag(value) == setTag;
+}
+
+module.exports = baseIsSet;
diff --git a/_baseIsTypedArray.js b/_baseIsTypedArray.js
new file mode 100644
index 000000000..5d1e43bda
--- /dev/null
+++ b/_baseIsTypedArray.js
@@ -0,0 +1,69 @@
+var isLength = require('./isLength'),
+ isObjectLike = require('./isObjectLike');
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ errorTag = '[object Error]',
+ funcTag = '[object Function]',
+ mapTag = '[object Map]',
+ numberTag = '[object Number]',
+ objectTag = '[object Object]',
+ regexpTag = '[object RegExp]',
+ setTag = '[object Set]',
+ stringTag = '[object String]',
+ weakMapTag = '[object WeakMap]';
+
+var arrayBufferTag = '[object ArrayBuffer]',
+ dataViewTag = '[object DataView]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+
+/** Used to identify `toStringTag` values of typed arrays. */
+var typedArrayTags = {};
+typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
+typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
+typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
+typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
+typedArrayTags[uint32Tag] = true;
+typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
+typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
+typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
+typedArrayTags[errorTag] = typedArrayTags[funcTag] =
+typedArrayTags[mapTag] = typedArrayTags[numberTag] =
+typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
+typedArrayTags[setTag] = typedArrayTags[stringTag] =
+typedArrayTags[weakMapTag] = false;
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/**
+ * The base implementation of `_.isTypedArray` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ */
+function baseIsTypedArray(value) {
+ return isObjectLike(value) &&
+ isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
+}
+
+module.exports = baseIsTypedArray;
diff --git a/_baseKeys.js b/_baseKeys.js
index 2c8ccb912..2a27d5554 100644
--- a/_baseKeys.js
+++ b/_baseKeys.js
@@ -1,3 +1,5 @@
+var overArg = require('./_overArg');
+
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = Object.keys;
@@ -9,8 +11,6 @@ var nativeKeys = Object.keys;
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
-function baseKeys(object) {
- return nativeKeys(Object(object));
-}
+var baseKeys = overArg(nativeKeys, Object);
module.exports = baseKeys;
diff --git a/_baseLt.js b/_baseLt.js
index aa05efacf..8674d2946 100644
--- a/_baseLt.js
+++ b/_baseLt.js
@@ -1,5 +1,5 @@
/**
- * The base implementation of `_.lt` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.lt` which doesn't coerce arguments.
*
* @private
* @param {*} value The value to compare.
diff --git a/_baseMergeDeep.js b/_baseMergeDeep.js
index 062f004c2..535c0d110 100644
--- a/_baseMergeDeep.js
+++ b/_baseMergeDeep.js
@@ -70,13 +70,12 @@ function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, sta
isCommon = false;
}
}
- stack.set(srcValue, newValue);
-
if (isCommon) {
// Recursively merge objects and arrays (susceptible to call stack limits).
+ stack.set(srcValue, newValue);
mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+ stack['delete'](srcValue);
}
- stack['delete'](srcValue);
assignMergeValue(object, key, newValue);
}
diff --git a/_baseNth.js b/_baseNth.js
index 6978a651d..0403c2a36 100644
--- a/_baseNth.js
+++ b/_baseNth.js
@@ -1,7 +1,7 @@
var isIndex = require('./_isIndex');
/**
- * The base implementation of `_.nth` which doesn't coerce `n` to an integer.
+ * The base implementation of `_.nth` which doesn't coerce arguments.
*
* @private
* @param {Array} array The array to query.
diff --git a/_basePick.js b/_basePick.js
index 727254830..add360020 100644
--- a/_basePick.js
+++ b/_basePick.js
@@ -1,4 +1,4 @@
-var arrayReduce = require('./_arrayReduce');
+var basePickBy = require('./_basePickBy');
/**
* The base implementation of `_.pick` without support for individual
@@ -11,12 +11,9 @@ var arrayReduce = require('./_arrayReduce');
*/
function basePick(object, props) {
object = Object(object);
- return arrayReduce(props, function(result, key) {
- if (key in object) {
- result[key] = object[key];
- }
- return result;
- }, {});
+ return basePickBy(object, props, function(value, key) {
+ return key in object;
+ });
}
module.exports = basePick;
diff --git a/_basePickBy.js b/_basePickBy.js
index 56ffa5f5d..fcc66105a 100644
--- a/_basePickBy.js
+++ b/_basePickBy.js
@@ -1,16 +1,14 @@
-var getAllKeysIn = require('./_getAllKeysIn');
-
/**
* The base implementation of `_.pickBy` without support for iteratee shorthands.
*
* @private
* @param {Object} object The source object.
+ * @param {string[]} props The property identifiers to pick from.
* @param {Function} predicate The function invoked per property.
* @returns {Object} Returns the new object.
*/
-function basePickBy(object, predicate) {
+function basePickBy(object, props, predicate) {
var index = -1,
- props = getAllKeysIn(object),
length = props.length,
result = {};
diff --git a/_basePropertyOf.js b/_basePropertyOf.js
new file mode 100644
index 000000000..461739990
--- /dev/null
+++ b/_basePropertyOf.js
@@ -0,0 +1,14 @@
+/**
+ * The base implementation of `_.propertyOf` without support for deep paths.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Function} Returns the new accessor function.
+ */
+function basePropertyOf(object) {
+ return function(key) {
+ return object == null ? undefined : object[key];
+ };
+}
+
+module.exports = basePropertyOf;
diff --git a/_baseRange.js b/_baseRange.js
index 02d4ae25f..0fb8e419f 100644
--- a/_baseRange.js
+++ b/_baseRange.js
@@ -4,7 +4,7 @@ var nativeCeil = Math.ceil,
/**
* The base implementation of `_.range` and `_.rangeRight` which doesn't
- * coerce arguments to numbers.
+ * coerce arguments.
*
* @private
* @param {number} start The start of the range.
diff --git a/_baseRest.js b/_baseRest.js
new file mode 100644
index 000000000..d8aa217c6
--- /dev/null
+++ b/_baseRest.js
@@ -0,0 +1,35 @@
+var apply = require('./_apply');
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeMax = Math.max;
+
+/**
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ */
+function baseRest(func, start) {
+ start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+ return function() {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ array = Array(length);
+
+ while (++index < length) {
+ array[index] = args[start + index];
+ }
+ index = -1;
+ var otherArgs = Array(start + 1);
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = array;
+ return apply(func, this, otherArgs);
+ };
+}
+
+module.exports = baseRest;
diff --git a/_baseUnary.js b/_baseUnary.js
index 4db20e22e..98639e92f 100644
--- a/_baseUnary.js
+++ b/_baseUnary.js
@@ -1,5 +1,5 @@
/**
- * The base implementation of `_.unary` without support for storing wrapper metadata.
+ * The base implementation of `_.unary` without support for storing metadata.
*
* @private
* @param {Function} func The function to cap arguments for.
diff --git a/_checkGlobal.js b/_checkGlobal.js
deleted file mode 100644
index b0ea47e12..000000000
--- a/_checkGlobal.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Checks if `value` is a global object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {null|Object} Returns `value` if it's a global object, else `null`.
- */
-function checkGlobal(value) {
- return (value && value.Object === Object) ? value : null;
-}
-
-module.exports = checkGlobal;
diff --git a/_copyObject.js b/_copyObject.js
index 474d17bb8..7d267b2e5 100644
--- a/_copyObject.js
+++ b/_copyObject.js
@@ -21,9 +21,9 @@ function copyObject(source, props, object, customizer) {
var newValue = customizer
? customizer(object[key], source[key], key, object, source)
- : source[key];
+ : undefined;
- assignValue(object, key, newValue);
+ assignValue(object, key, newValue === undefined ? source[key] : newValue);
}
return object;
}
diff --git a/_createAggregator.js b/_createAggregator.js
index 7f7afd2c1..0be42c41c 100644
--- a/_createAggregator.js
+++ b/_createAggregator.js
@@ -16,7 +16,7 @@ function createAggregator(setter, initializer) {
var func = isArray(collection) ? arrayAggregator : baseAggregator,
accumulator = initializer ? initializer() : {};
- return func(collection, setter, baseIteratee(iteratee), accumulator);
+ return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
};
}
diff --git a/_createAssigner.js b/_createAssigner.js
index e0ba582ff..1f904c51b 100644
--- a/_createAssigner.js
+++ b/_createAssigner.js
@@ -1,5 +1,5 @@
-var isIterateeCall = require('./_isIterateeCall'),
- rest = require('./rest');
+var baseRest = require('./_baseRest'),
+ isIterateeCall = require('./_isIterateeCall');
/**
* Creates a function like `_.assign`.
@@ -9,7 +9,7 @@ var isIterateeCall = require('./_isIterateeCall'),
* @returns {Function} Returns the new assigner function.
*/
function createAssigner(assigner) {
- return rest(function(object, sources) {
+ return baseRest(function(object, sources) {
var index = -1,
length = sources.length,
customizer = length > 1 ? sources[length - 1] : undefined,
diff --git a/_createBaseWrapper.js b/_createBind.js
similarity index 62%
rename from _createBaseWrapper.js
rename to _createBind.js
index c365621bd..aadc94380 100644
--- a/_createBaseWrapper.js
+++ b/_createBind.js
@@ -1,7 +1,7 @@
-var createCtorWrapper = require('./_createCtorWrapper'),
+var createCtor = require('./_createCtor'),
root = require('./_root');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1;
/**
@@ -10,14 +10,13 @@ var BIND_FLAG = 1;
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {*} [thisArg] The `this` binding of `func`.
* @returns {Function} Returns the new wrapped function.
*/
-function createBaseWrapper(func, bitmask, thisArg) {
+function createBind(func, bitmask, thisArg) {
var isBind = bitmask & BIND_FLAG,
- Ctor = createCtorWrapper(func);
+ Ctor = createCtor(func);
function wrapper() {
var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
@@ -26,4 +25,4 @@ function createBaseWrapper(func, bitmask, thisArg) {
return wrapper;
}
-module.exports = createBaseWrapper;
+module.exports = createBind;
diff --git a/_createCtorWrapper.js b/_createCtor.js
similarity index 95%
rename from _createCtorWrapper.js
rename to _createCtor.js
index 17e1bd831..ee904f4ff 100644
--- a/_createCtorWrapper.js
+++ b/_createCtor.js
@@ -9,7 +9,7 @@ var baseCreate = require('./_baseCreate'),
* @param {Function} Ctor The constructor to wrap.
* @returns {Function} Returns the new wrapped function.
*/
-function createCtorWrapper(Ctor) {
+function createCtor(Ctor) {
return function() {
// Use a `switch` statement to work with class constructors. See
// http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
@@ -34,4 +34,4 @@ function createCtorWrapper(Ctor) {
};
}
-module.exports = createCtorWrapper;
+module.exports = createCtor;
diff --git a/_createCurryWrapper.js b/_createCurry.js
similarity index 66%
rename from _createCurryWrapper.js
rename to _createCurry.js
index d765b84d0..f06c2cdd8 100644
--- a/_createCurryWrapper.js
+++ b/_createCurry.js
@@ -1,7 +1,7 @@
var apply = require('./_apply'),
- createCtorWrapper = require('./_createCtorWrapper'),
- createHybridWrapper = require('./_createHybridWrapper'),
- createRecurryWrapper = require('./_createRecurryWrapper'),
+ createCtor = require('./_createCtor'),
+ createHybrid = require('./_createHybrid'),
+ createRecurry = require('./_createRecurry'),
getHolder = require('./_getHolder'),
replaceHolders = require('./_replaceHolders'),
root = require('./_root');
@@ -11,13 +11,12 @@ var apply = require('./_apply'),
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {number} arity The arity of `func`.
* @returns {Function} Returns the new wrapped function.
*/
-function createCurryWrapper(func, bitmask, arity) {
- var Ctor = createCtorWrapper(func);
+function createCurry(func, bitmask, arity) {
+ var Ctor = createCtor(func);
function wrapper() {
var length = arguments.length,
@@ -34,8 +33,8 @@ function createCurryWrapper(func, bitmask, arity) {
length -= holders.length;
if (length < arity) {
- return createRecurryWrapper(
- func, bitmask, createHybridWrapper, wrapper.placeholder, undefined,
+ return createRecurry(
+ func, bitmask, createHybrid, wrapper.placeholder, undefined,
args, holders, undefined, undefined, arity - length);
}
var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
@@ -44,4 +43,4 @@ function createCurryWrapper(func, bitmask, arity) {
return wrapper;
}
-module.exports = createCurryWrapper;
+module.exports = createCurry;
diff --git a/_createFind.js b/_createFind.js
index 0a84618eb..8859ff89f 100644
--- a/_createFind.js
+++ b/_createFind.js
@@ -12,18 +12,13 @@ var baseIteratee = require('./_baseIteratee'),
function createFind(findIndexFunc) {
return function(collection, predicate, fromIndex) {
var iterable = Object(collection);
- predicate = baseIteratee(predicate, 3);
if (!isArrayLike(collection)) {
- var props = keys(collection);
+ var iteratee = baseIteratee(predicate, 3);
+ collection = keys(collection);
+ predicate = function(key) { return iteratee(iterable[key], key, iterable); };
}
- var index = findIndexFunc(props || collection, function(value, key) {
- if (props) {
- key = value;
- value = iterable[key];
- }
- return predicate(value, key, iterable);
- }, fromIndex);
- return index > -1 ? collection[props ? props[index] : index] : undefined;
+ var index = findIndexFunc(collection, predicate, fromIndex);
+ return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
};
}
diff --git a/_createFlow.js b/_createFlow.js
index 6b5ee54be..911aaf15c 100644
--- a/_createFlow.js
+++ b/_createFlow.js
@@ -1,10 +1,10 @@
var LodashWrapper = require('./_LodashWrapper'),
baseFlatten = require('./_baseFlatten'),
+ baseRest = require('./_baseRest'),
getData = require('./_getData'),
getFuncName = require('./_getFuncName'),
isArray = require('./isArray'),
- isLaziable = require('./_isLaziable'),
- rest = require('./rest');
+ isLaziable = require('./_isLaziable');
/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;
@@ -12,7 +12,7 @@ var LARGE_ARRAY_SIZE = 200;
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var CURRY_FLAG = 8,
PARTIAL_FLAG = 32,
ARY_FLAG = 128,
@@ -26,7 +26,7 @@ var CURRY_FLAG = 8,
* @returns {Function} Returns the new flow function.
*/
function createFlow(fromRight) {
- return rest(function(funcs) {
+ return baseRest(function(funcs) {
funcs = baseFlatten(funcs, 1);
var length = funcs.length,
diff --git a/_createHybridWrapper.js b/_createHybrid.js
similarity index 80%
rename from _createHybridWrapper.js
rename to _createHybrid.js
index e433640af..1594b886c 100644
--- a/_createHybridWrapper.js
+++ b/_createHybrid.js
@@ -1,14 +1,14 @@
var composeArgs = require('./_composeArgs'),
composeArgsRight = require('./_composeArgsRight'),
countHolders = require('./_countHolders'),
- createCtorWrapper = require('./_createCtorWrapper'),
- createRecurryWrapper = require('./_createRecurryWrapper'),
+ createCtor = require('./_createCtor'),
+ createRecurry = require('./_createRecurry'),
getHolder = require('./_getHolder'),
reorder = require('./_reorder'),
replaceHolders = require('./_replaceHolders'),
root = require('./_root');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1,
BIND_KEY_FLAG = 2,
CURRY_FLAG = 8,
@@ -22,8 +22,7 @@ var BIND_FLAG = 1,
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {*} [thisArg] The `this` binding of `func`.
* @param {Array} [partials] The arguments to prepend to those provided to
* the new function.
@@ -36,13 +35,13 @@ var BIND_FLAG = 1,
* @param {number} [arity] The arity of `func`.
* @returns {Function} Returns the new wrapped function.
*/
-function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
+function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
var isAry = bitmask & ARY_FLAG,
isBind = bitmask & BIND_FLAG,
isBindKey = bitmask & BIND_KEY_FLAG,
isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG),
isFlip = bitmask & FLIP_FLAG,
- Ctor = isBindKey ? undefined : createCtorWrapper(func);
+ Ctor = isBindKey ? undefined : createCtor(func);
function wrapper() {
var length = arguments.length,
@@ -65,8 +64,8 @@ function createHybridWrapper(func, bitmask, thisArg, partials, holders, partials
length -= holdersCount;
if (isCurried && length < arity) {
var newHolders = replaceHolders(args, placeholder);
- return createRecurryWrapper(
- func, bitmask, createHybridWrapper, wrapper.placeholder, thisArg,
+ return createRecurry(
+ func, bitmask, createHybrid, wrapper.placeholder, thisArg,
args, newHolders, argPos, ary, arity - length
);
}
@@ -83,11 +82,11 @@ function createHybridWrapper(func, bitmask, thisArg, partials, holders, partials
args.length = ary;
}
if (this && this !== root && this instanceof wrapper) {
- fn = Ctor || createCtorWrapper(fn);
+ fn = Ctor || createCtor(fn);
}
return fn.apply(thisBinding, args);
}
return wrapper;
}
-module.exports = createHybridWrapper;
+module.exports = createHybrid;
diff --git a/_createMathOperation.js b/_createMathOperation.js
index e750e98b1..f1e238ac0 100644
--- a/_createMathOperation.js
+++ b/_createMathOperation.js
@@ -6,13 +6,14 @@ var baseToNumber = require('./_baseToNumber'),
*
* @private
* @param {Function} operator The function to perform the operation.
+ * @param {number} [defaultValue] The value used for `undefined` arguments.
* @returns {Function} Returns the new mathematical operation function.
*/
-function createMathOperation(operator) {
+function createMathOperation(operator, defaultValue) {
return function(value, other) {
var result;
if (value === undefined && other === undefined) {
- return 0;
+ return defaultValue;
}
if (value !== undefined) {
result = value;
diff --git a/_createOver.js b/_createOver.js
index e5f9b8b91..723182dc1 100644
--- a/_createOver.js
+++ b/_createOver.js
@@ -2,10 +2,9 @@ var apply = require('./_apply'),
arrayMap = require('./_arrayMap'),
baseFlatten = require('./_baseFlatten'),
baseIteratee = require('./_baseIteratee'),
+ baseRest = require('./_baseRest'),
baseUnary = require('./_baseUnary'),
- isArray = require('./isArray'),
- isFlattenableIteratee = require('./_isFlattenableIteratee'),
- rest = require('./rest');
+ isArray = require('./isArray');
/**
* Creates a function like `_.over`.
@@ -15,12 +14,12 @@ var apply = require('./_apply'),
* @returns {Function} Returns the new over function.
*/
function createOver(arrayFunc) {
- return rest(function(iteratees) {
+ return baseRest(function(iteratees) {
iteratees = (iteratees.length == 1 && isArray(iteratees[0]))
? arrayMap(iteratees[0], baseUnary(baseIteratee))
- : arrayMap(baseFlatten(iteratees, 1, isFlattenableIteratee), baseUnary(baseIteratee));
+ : arrayMap(baseFlatten(iteratees, 1), baseUnary(baseIteratee));
- return rest(function(args) {
+ return baseRest(function(args) {
var thisArg = this;
return arrayFunc(iteratees, function(iteratee) {
return apply(iteratee, thisArg, args);
diff --git a/_createPartialWrapper.js b/_createPartial.js
similarity index 75%
rename from _createPartialWrapper.js
rename to _createPartial.js
index cc4314ef9..fc2bf8be2 100644
--- a/_createPartialWrapper.js
+++ b/_createPartial.js
@@ -1,8 +1,8 @@
var apply = require('./_apply'),
- createCtorWrapper = require('./_createCtorWrapper'),
+ createCtor = require('./_createCtor'),
root = require('./_root');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1;
/**
@@ -11,16 +11,15 @@ var BIND_FLAG = 1;
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {*} thisArg The `this` binding of `func`.
* @param {Array} partials The arguments to prepend to those provided to
* the new function.
* @returns {Function} Returns the new wrapped function.
*/
-function createPartialWrapper(func, bitmask, thisArg, partials) {
+function createPartial(func, bitmask, thisArg, partials) {
var isBind = bitmask & BIND_FLAG,
- Ctor = createCtorWrapper(func);
+ Ctor = createCtor(func);
function wrapper() {
var argsIndex = -1,
@@ -41,4 +40,4 @@ function createPartialWrapper(func, bitmask, thisArg, partials) {
return wrapper;
}
-module.exports = createPartialWrapper;
+module.exports = createPartial;
diff --git a/_createRecurryWrapper.js b/_createRecurry.js
similarity index 79%
rename from _createRecurryWrapper.js
rename to _createRecurry.js
index 63c096ad7..35a22e586 100644
--- a/_createRecurryWrapper.js
+++ b/_createRecurry.js
@@ -1,7 +1,8 @@
var isLaziable = require('./_isLaziable'),
- setData = require('./_setData');
+ setData = require('./_setData'),
+ setWrapToString = require('./_setWrapToString');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1,
BIND_KEY_FLAG = 2,
CURRY_BOUND_FLAG = 4,
@@ -14,8 +15,7 @@ var BIND_FLAG = 1,
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {Function} wrapFunc The function to create the `func` wrapper.
* @param {*} placeholder The placeholder value.
* @param {*} [thisArg] The `this` binding of `func`.
@@ -27,7 +27,7 @@ var BIND_FLAG = 1,
* @param {number} [arity] The arity of `func`.
* @returns {Function} Returns the new wrapped function.
*/
-function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
+function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
var isCurry = bitmask & CURRY_FLAG,
newHolders = isCurry ? holders : undefined,
newHoldersRight = isCurry ? undefined : holders,
@@ -50,7 +50,7 @@ function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, par
setData(result, newData);
}
result.placeholder = placeholder;
- return result;
+ return setWrapToString(result, func, bitmask);
}
-module.exports = createRecurryWrapper;
+module.exports = createRecurry;
diff --git a/_createSet.js b/_createSet.js
index ae24d0593..0f644eeae 100644
--- a/_createSet.js
+++ b/_createSet.js
@@ -6,7 +6,7 @@ var Set = require('./_Set'),
var INFINITY = 1 / 0;
/**
- * Creates a set of `values`.
+ * Creates a set object of `values`.
*
* @private
* @param {Array} values The values to add to the set.
diff --git a/_createWrapper.js b/_createWrap.js
similarity index 79%
rename from _createWrapper.js
rename to _createWrap.js
index c77e76395..6afe6b5f3 100644
--- a/_createWrapper.js
+++ b/_createWrap.js
@@ -1,17 +1,18 @@
var baseSetData = require('./_baseSetData'),
- createBaseWrapper = require('./_createBaseWrapper'),
- createCurryWrapper = require('./_createCurryWrapper'),
- createHybridWrapper = require('./_createHybridWrapper'),
- createPartialWrapper = require('./_createPartialWrapper'),
+ createBind = require('./_createBind'),
+ createCurry = require('./_createCurry'),
+ createHybrid = require('./_createHybrid'),
+ createPartial = require('./_createPartial'),
getData = require('./_getData'),
mergeData = require('./_mergeData'),
setData = require('./_setData'),
+ setWrapToString = require('./_setWrapToString'),
toInteger = require('./toInteger');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1,
BIND_KEY_FLAG = 2,
CURRY_FLAG = 8,
@@ -28,7 +29,7 @@ var nativeMax = Math.max;
*
* @private
* @param {Function|string} func The function or method name to wrap.
- * @param {number} bitmask The bitmask of wrapper flags.
+ * @param {number} bitmask The bitmask flags.
* The bitmask may be composed of the following flags:
* 1 - `_.bind`
* 2 - `_.bindKey`
@@ -48,7 +49,7 @@ var nativeMax = Math.max;
* @param {number} [arity] The arity of `func`.
* @returns {Function} Returns the new wrapped function.
*/
-function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
+function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
var isBindKey = bitmask & BIND_KEY_FLAG;
if (!isBindKey && typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
@@ -91,16 +92,16 @@ function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, a
bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG);
}
if (!bitmask || bitmask == BIND_FLAG) {
- var result = createBaseWrapper(func, bitmask, thisArg);
+ var result = createBind(func, bitmask, thisArg);
} else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) {
- result = createCurryWrapper(func, bitmask, arity);
+ result = createCurry(func, bitmask, arity);
} else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) {
- result = createPartialWrapper(func, bitmask, thisArg, partials);
+ result = createPartial(func, bitmask, thisArg, partials);
} else {
- result = createHybridWrapper.apply(undefined, newData);
+ result = createHybrid.apply(undefined, newData);
}
var setter = data ? baseSetData : setData;
- return setter(result, newData);
+ return setWrapToString(setter(result, newData), func, bitmask);
}
-module.exports = createWrapper;
+module.exports = createWrap;
diff --git a/_deburrLetter.js b/_deburrLetter.js
index e559dbea7..f7be3d4f0 100644
--- a/_deburrLetter.js
+++ b/_deburrLetter.js
@@ -1,3 +1,5 @@
+var basePropertyOf = require('./_basePropertyOf');
+
/** Used to map latin-1 supplementary letters to basic latin letters. */
var deburredLetters = {
'\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
@@ -26,8 +28,6 @@ var deburredLetters = {
* @param {string} letter The matched letter to deburr.
* @returns {string} Returns the deburred letter.
*/
-function deburrLetter(letter) {
- return deburredLetters[letter];
-}
+var deburrLetter = basePropertyOf(deburredLetters);
module.exports = deburrLetter;
diff --git a/_defineProperty.js b/_defineProperty.js
new file mode 100644
index 000000000..f6128d776
--- /dev/null
+++ b/_defineProperty.js
@@ -0,0 +1,11 @@
+var getNative = require('./_getNative');
+
+/* Used to set `toString` methods. */
+var defineProperty = (function() {
+ var func = getNative(Object, 'defineProperty'),
+ name = getNative.name;
+
+ return (name && name.length > 2) ? func : undefined;
+}());
+
+module.exports = defineProperty;
diff --git a/_equalArrays.js b/_equalArrays.js
index 17ef31312..02c354d27 100644
--- a/_equalArrays.js
+++ b/_equalArrays.js
@@ -29,7 +29,7 @@ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
}
// Assume cyclic values are equal.
var stacked = stack.get(array);
- if (stacked) {
+ if (stacked && stack.get(other)) {
return stacked == other;
}
var index = -1,
@@ -37,6 +37,7 @@ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;
stack.set(array, other);
+ stack.set(other, array);
// Ignore non-index properties.
while (++index < arrLength) {
diff --git a/_equalByTag.js b/_equalByTag.js
index b3e37bd8a..d6baa0a55 100644
--- a/_equalByTag.js
+++ b/_equalByTag.js
@@ -1,5 +1,6 @@
var Symbol = require('./_Symbol'),
Uint8Array = require('./_Uint8Array'),
+ eq = require('./eq'),
equalArrays = require('./_equalArrays'),
mapToArray = require('./_mapToArray'),
setToArray = require('./_setToArray');
@@ -63,18 +64,14 @@ function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
case boolTag:
case dateTag:
- // Coerce dates and booleans to numbers, dates to milliseconds and
- // booleans to `1` or `0` treating invalid dates coerced to `NaN` as
- // not equal.
- return +object == +other;
+ case numberTag:
+ // Coerce booleans to `1` or `0` and dates to milliseconds.
+ // Invalid dates are coerced to `NaN`.
+ return eq(+object, +other);
case errorTag:
return object.name == other.name && object.message == other.message;
- case numberTag:
- // Treat `NaN` vs. `NaN` as equal.
- return (object != +object) ? other != +other : object == +other;
-
case regexpTag:
case stringTag:
// Coerce regexes to strings and treat strings, primitives and objects,
@@ -98,10 +95,12 @@ function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
return stacked == other;
}
bitmask |= UNORDERED_COMPARE_FLAG;
- stack.set(object, other);
// Recursively compare objects (susceptible to call stack limits).
- return equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
+ stack.set(object, other);
+ var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
+ stack['delete'](object);
+ return result;
case symbolTag:
if (symbolValueOf) {
diff --git a/_equalObjects.js b/_equalObjects.js
index 9a5d17fac..71c42750e 100644
--- a/_equalObjects.js
+++ b/_equalObjects.js
@@ -37,11 +37,12 @@ function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
- if (stacked) {
+ if (stacked && stack.get(other)) {
return stacked == other;
}
var result = true;
stack.set(object, other);
+ stack.set(other, object);
var skipCtor = isPartial;
while (++index < objLength) {
diff --git a/_escapeHtmlChar.js b/_escapeHtmlChar.js
index b21e452b5..6abceb51c 100644
--- a/_escapeHtmlChar.js
+++ b/_escapeHtmlChar.js
@@ -1,3 +1,5 @@
+var basePropertyOf = require('./_basePropertyOf');
+
/** Used to map characters to HTML entities. */
var htmlEscapes = {
'&': '&',
@@ -15,8 +17,6 @@ var htmlEscapes = {
* @param {string} chr The matched character to escape.
* @returns {string} Returns the escaped character.
*/
-function escapeHtmlChar(chr) {
- return htmlEscapes[chr];
-}
+var escapeHtmlChar = basePropertyOf(htmlEscapes);
module.exports = escapeHtmlChar;
diff --git a/_freeGlobal.js b/_freeGlobal.js
new file mode 100644
index 000000000..bbec998fc
--- /dev/null
+++ b/_freeGlobal.js
@@ -0,0 +1,4 @@
+/** Detect free variable `global` from Node.js. */
+var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+module.exports = freeGlobal;
diff --git a/_getPrototype.js b/_getPrototype.js
index 1ef6d927e..572479388 100644
--- a/_getPrototype.js
+++ b/_getPrototype.js
@@ -1,3 +1,5 @@
+var overArg = require('./_overArg');
+
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeGetPrototype = Object.getPrototypeOf;
@@ -8,8 +10,6 @@ var nativeGetPrototype = Object.getPrototypeOf;
* @param {*} value The value to query.
* @returns {null|Object} Returns the `[[Prototype]]`.
*/
-function getPrototype(value) {
- return nativeGetPrototype(Object(value));
-}
+var getPrototype = overArg(nativeGetPrototype, Object);
module.exports = getPrototype;
diff --git a/_getSymbols.js b/_getSymbols.js
index 1a7691733..e41dad1d5 100644
--- a/_getSymbols.js
+++ b/_getSymbols.js
@@ -1,7 +1,8 @@
-var stubArray = require('./stubArray');
+var overArg = require('./_overArg'),
+ stubArray = require('./stubArray');
-/** Built-in value references. */
-var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeGetSymbols = Object.getOwnPropertySymbols;
/**
* Creates an array of the own enumerable symbol properties of `object`.
@@ -10,15 +11,6 @@ var getOwnPropertySymbols = Object.getOwnPropertySymbols;
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
-function getSymbols(object) {
- // 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 = stubArray;
-}
+var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;
module.exports = getSymbols;
diff --git a/_getSymbolsIn.js b/_getSymbolsIn.js
index 3a3729f05..38e7783f4 100644
--- a/_getSymbolsIn.js
+++ b/_getSymbolsIn.js
@@ -2,8 +2,8 @@ var arrayPush = require('./_arrayPush'),
getPrototype = require('./_getPrototype'),
getSymbols = require('./_getSymbols');
-/** Built-in value references. */
-var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeGetSymbols = Object.getOwnPropertySymbols;
/**
* Creates an array of the own and inherited enumerable symbol properties
@@ -13,7 +13,7 @@ var getOwnPropertySymbols = Object.getOwnPropertySymbols;
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
-var getSymbolsIn = !getOwnPropertySymbols ? getSymbols : function(object) {
+var getSymbolsIn = !nativeGetSymbols ? getSymbols : function(object) {
var result = [];
while (object) {
arrayPush(result, getSymbols(object));
diff --git a/_getTag.js b/_getTag.js
index 0d1a455c1..af186020b 100644
--- a/_getTag.js
+++ b/_getTag.js
@@ -3,6 +3,7 @@ var DataView = require('./_DataView'),
Promise = require('./_Promise'),
Set = require('./_Set'),
WeakMap = require('./_WeakMap'),
+ baseGetTag = require('./_baseGetTag'),
toSource = require('./_toSource');
/** `Object#toString` result references. */
@@ -38,9 +39,7 @@ var dataViewCtorString = toSource(DataView),
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
-function getTag(value) {
- return objectToString.call(value);
-}
+var getTag = baseGetTag;
// Fallback for data views, maps, sets, and weak maps in IE 11,
// for data views in Edge, and promises in Node.js.
diff --git a/_getWrapDetails.js b/_getWrapDetails.js
new file mode 100644
index 000000000..3bcc6e48a
--- /dev/null
+++ b/_getWrapDetails.js
@@ -0,0 +1,17 @@
+/** Used to match wrap detail comments. */
+var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
+ reSplitDetails = /,? & /;
+
+/**
+ * Extracts wrapper details from the `source` body comment.
+ *
+ * @private
+ * @param {string} source The source to inspect.
+ * @returns {Array} Returns the wrapper details.
+ */
+function getWrapDetails(source) {
+ var match = source.match(reWrapDetails);
+ return match ? match[1].split(reSplitDetails) : [];
+}
+
+module.exports = getWrapDetails;
diff --git a/_indexOfNaN.js b/_indexOfNaN.js
deleted file mode 100644
index 49a42bb82..000000000
--- a/_indexOfNaN.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Gets the index at which the first occurrence of `NaN` is found in `array`.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {number} fromIndex The index to search from.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {number} Returns the index of the matched `NaN`, else `-1`.
- */
-function indexOfNaN(array, fromIndex, fromRight) {
- var length = array.length,
- index = fromIndex + (fromRight ? 1 : -1);
-
- while ((fromRight ? index-- : ++index < length)) {
- var other = array[index];
- if (other !== other) {
- return index;
- }
- }
- return -1;
-}
-
-module.exports = indexOfNaN;
diff --git a/_insertWrapDetails.js b/_insertWrapDetails.js
new file mode 100644
index 000000000..191f226de
--- /dev/null
+++ b/_insertWrapDetails.js
@@ -0,0 +1,21 @@
+/** Used to match wrap detail comments. */
+var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
+
+/**
+ * Inserts wrapper `details` in a comment at the top of the `source` body.
+ *
+ * @private
+ * @param {string} source The source to modify.
+ * @returns {Array} details The details to insert.
+ * @returns {string} Returns the modified source.
+ */
+function insertWrapDetails(source, details) {
+ var length = details.length,
+ lastIndex = length - 1;
+
+ details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
+ details = details.join(length > 2 ? ', ' : ' ');
+ return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
+}
+
+module.exports = insertWrapDetails;
diff --git a/_isFlattenable.js b/_isFlattenable.js
index 1764fef6b..d33f3a8ca 100644
--- a/_isFlattenable.js
+++ b/_isFlattenable.js
@@ -1,6 +1,10 @@
-var isArguments = require('./isArguments'),
+var Symbol = require('./_Symbol'),
+ isArguments = require('./isArguments'),
isArray = require('./isArray');
+/** Built-in value references. */
+var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
+
/**
* Checks if `value` is a flattenable `arguments` object or array.
*
@@ -9,7 +13,8 @@ var isArguments = require('./isArguments'),
* @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
*/
function isFlattenable(value) {
- return isArray(value) || isArguments(value);
+ return isArray(value) || isArguments(value) ||
+ !!(spreadableSymbol && value && value[spreadableSymbol])
}
module.exports = isFlattenable;
diff --git a/_isFlattenableIteratee.js b/_isFlattenableIteratee.js
deleted file mode 100644
index f7ede3e22..000000000
--- a/_isFlattenableIteratee.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var isArray = require('./isArray'),
- isFunction = require('./isFunction');
-
-/**
- * Checks if `value` is a flattenable array and not a `_.matchesProperty`
- * iteratee shorthand.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
- */
-function isFlattenableIteratee(value) {
- return isArray(value) && !(value.length == 2 && !isFunction(value[0]));
-}
-
-module.exports = isFlattenableIteratee;
diff --git a/_mergeData.js b/_mergeData.js
index 911e6ae7a..5aa1f1ff1 100644
--- a/_mergeData.js
+++ b/_mergeData.js
@@ -5,7 +5,7 @@ var composeArgs = require('./_composeArgs'),
/** Used as the internal argument placeholder. */
var PLACEHOLDER = '__lodash_placeholder__';
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1,
BIND_KEY_FLAG = 2,
CURRY_BOUND_FLAG = 4,
diff --git a/_mergeDefaults.js b/_mergeDefaults.js
index 33375cc5b..9888f0e76 100644
--- a/_mergeDefaults.js
+++ b/_mergeDefaults.js
@@ -16,7 +16,10 @@ var baseMerge = require('./_baseMerge'),
*/
function mergeDefaults(objValue, srcValue, key, object, source, stack) {
if (isObject(objValue) && isObject(srcValue)) {
- baseMerge(objValue, srcValue, undefined, mergeDefaults, stack.set(srcValue, objValue));
+ // Recursively merge objects and arrays (susceptible to call stack limits).
+ stack.set(srcValue, objValue);
+ baseMerge(objValue, srcValue, undefined, mergeDefaults, stack);
+ stack['delete'](srcValue);
}
return objValue;
}
diff --git a/_nodeUtil.js b/_nodeUtil.js
new file mode 100644
index 000000000..7b7068b99
--- /dev/null
+++ b/_nodeUtil.js
@@ -0,0 +1,22 @@
+var freeGlobal = require('./_freeGlobal');
+
+/** Detect free variable `exports`. */
+var freeExports = freeGlobal && typeof exports == 'object' && exports;
+
+/** Detect free variable `module`. */
+var freeModule = freeExports && typeof module == 'object' && module;
+
+/** Detect the popular CommonJS extension `module.exports`. */
+var moduleExports = freeModule && freeModule.exports === freeExports;
+
+/** Detect free variable `process` from Node.js. */
+var freeProcess = moduleExports && freeGlobal.process;
+
+/** Used to access faster Node.js helpers. */
+var nodeUtil = (function() {
+ try {
+ return freeProcess && freeProcess.binding('util');
+ } catch (e) {}
+}());
+
+module.exports = nodeUtil;
diff --git a/_overArg.js b/_overArg.js
new file mode 100644
index 000000000..f3c170a7a
--- /dev/null
+++ b/_overArg.js
@@ -0,0 +1,15 @@
+/**
+ * Creates a function that invokes `func` with its first argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
+function overArg(func, transform) {
+ return function(arg) {
+ return func(transform(arg));
+ };
+}
+
+module.exports = overArg;
diff --git a/_root.js b/_root.js
index c46a71af9..d2852bed4 100644
--- a/_root.js
+++ b/_root.js
@@ -1,15 +1,9 @@
-var checkGlobal = require('./_checkGlobal');
-
-/** Detect free variable `global` from Node.js. */
-var freeGlobal = checkGlobal(typeof global == 'object' && global);
+var freeGlobal = require('./_freeGlobal');
/** Detect free variable `self`. */
-var freeSelf = checkGlobal(typeof self == 'object' && self);
-
-/** Detect `this` as the global object. */
-var thisGlobal = checkGlobal(typeof this == 'object' && this);
+var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
-var root = freeGlobal || freeSelf || thisGlobal || Function('return this')();
+var root = freeGlobal || freeSelf || Function('return this')();
module.exports = root;
diff --git a/_setWrapToString.js b/_setWrapToString.js
new file mode 100644
index 000000000..3c53cd0fc
--- /dev/null
+++ b/_setWrapToString.js
@@ -0,0 +1,27 @@
+var constant = require('./constant'),
+ defineProperty = require('./_defineProperty'),
+ getWrapDetails = require('./_getWrapDetails'),
+ identity = require('./identity'),
+ insertWrapDetails = require('./_insertWrapDetails'),
+ updateWrapDetails = require('./_updateWrapDetails');
+
+/**
+ * Sets the `toString` method of `wrapper` to mimic the source of `reference`
+ * with wrapper details in a comment at the top of the source body.
+ *
+ * @private
+ * @param {Function} wrapper The function to modify.
+ * @param {Function} reference The reference function.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @returns {Function} Returns `wrapper`.
+ */
+var setWrapToString = !defineProperty ? identity : function(wrapper, reference, bitmask) {
+ var source = (reference + '');
+ return defineProperty(wrapper, 'toString', {
+ 'configurable': true,
+ 'enumerable': false,
+ 'value': constant(insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)))
+ });
+};
+
+module.exports = setWrapToString;
diff --git a/_stackSet.js b/_stackSet.js
index 0380ee54c..604918376 100644
--- a/_stackSet.js
+++ b/_stackSet.js
@@ -1,4 +1,5 @@
var ListCache = require('./_ListCache'),
+ Map = require('./_Map'),
MapCache = require('./_MapCache');
/** Used as the size to enable large array optimizations. */
@@ -16,8 +17,13 @@ var LARGE_ARRAY_SIZE = 200;
*/
function stackSet(key, value) {
var cache = this.__data__;
- if (cache instanceof ListCache && cache.__data__.length == LARGE_ARRAY_SIZE) {
- cache = this.__data__ = new MapCache(cache.__data__);
+ if (cache instanceof ListCache) {
+ var pairs = cache.__data__;
+ if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+ pairs.push([key, value]);
+ return this;
+ }
+ cache = this.__data__ = new MapCache(pairs);
}
cache.set(key, value);
return this;
diff --git a/_unescapeHtmlChar.js b/_unescapeHtmlChar.js
index 28b345498..11e5b7d55 100644
--- a/_unescapeHtmlChar.js
+++ b/_unescapeHtmlChar.js
@@ -1,3 +1,5 @@
+var basePropertyOf = require('./_basePropertyOf');
+
/** Used to map HTML entities to characters. */
var htmlUnescapes = {
'&': '&',
@@ -15,8 +17,6 @@ var htmlUnescapes = {
* @param {string} chr The matched character to unescape.
* @returns {string} Returns the unescaped character.
*/
-function unescapeHtmlChar(chr) {
- return htmlUnescapes[chr];
-}
+var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
module.exports = unescapeHtmlChar;
diff --git a/_updateWrapDetails.js b/_updateWrapDetails.js
new file mode 100644
index 000000000..128b1b46d
--- /dev/null
+++ b/_updateWrapDetails.js
@@ -0,0 +1,46 @@
+var arrayEach = require('./_arrayEach'),
+ arrayIncludes = require('./_arrayIncludes');
+
+/** Used to compose bitmasks for function metadata. */
+var BIND_FLAG = 1,
+ BIND_KEY_FLAG = 2,
+ CURRY_FLAG = 8,
+ CURRY_RIGHT_FLAG = 16,
+ PARTIAL_FLAG = 32,
+ PARTIAL_RIGHT_FLAG = 64,
+ ARY_FLAG = 128,
+ REARG_FLAG = 256,
+ FLIP_FLAG = 512;
+
+/** Used to associate wrap methods with their bit flags. */
+var wrapFlags = [
+ ['ary', ARY_FLAG],
+ ['bind', BIND_FLAG],
+ ['bindKey', BIND_KEY_FLAG],
+ ['curry', CURRY_FLAG],
+ ['curryRight', CURRY_RIGHT_FLAG],
+ ['flip', FLIP_FLAG],
+ ['partial', PARTIAL_FLAG],
+ ['partialRight', PARTIAL_RIGHT_FLAG],
+ ['rearg', REARG_FLAG]
+];
+
+/**
+ * Updates wrapper `details` based on `bitmask` flags.
+ *
+ * @private
+ * @returns {Array} details The details to modify.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @returns {Array} Returns `details`.
+ */
+function updateWrapDetails(details, bitmask) {
+ arrayEach(wrapFlags, function(pair) {
+ var value = '_.' + pair[0];
+ if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
+ details.push(value);
+ }
+ });
+ return details.sort();
+}
+
+module.exports = updateWrapDetails;
diff --git a/add.js b/add.js
index d82c6522a..f06951564 100644
--- a/add.js
+++ b/add.js
@@ -17,6 +17,6 @@ var createMathOperation = require('./_createMathOperation');
*/
var add = createMathOperation(function(augend, addend) {
return augend + addend;
-});
+}, 0);
module.exports = add;
diff --git a/ary.js b/ary.js
index 91ce37969..c743b06a1 100644
--- a/ary.js
+++ b/ary.js
@@ -1,6 +1,6 @@
-var createWrapper = require('./_createWrapper');
+var createWrap = require('./_createWrap');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var ARY_FLAG = 128;
/**
@@ -23,7 +23,7 @@ var ARY_FLAG = 128;
function ary(func, n, guard) {
n = guard ? undefined : n;
n = (func && n == null) ? func.length : n;
- return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
+ return createWrap(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
}
module.exports = ary;
diff --git a/assign.js b/assign.js
index 2a60ff2c5..5488c8b69 100644
--- a/assign.js
+++ b/assign.js
@@ -36,18 +36,18 @@ var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');
* @example
*
* function Foo() {
- * this.c = 3;
+ * this.a = 1;
* }
*
* function Bar() {
- * this.e = 5;
+ * this.c = 3;
* }
*
- * Foo.prototype.d = 4;
- * Bar.prototype.f = 6;
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
*
- * _.assign({ 'a': 1 }, new Foo, new Bar);
- * // => { 'a': 1, 'c': 3, 'e': 5 }
+ * _.assign({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'c': 3 }
*/
var assign = createAssigner(function(object, source) {
if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {
diff --git a/assignIn.js b/assignIn.js
index b001c492a..e77aebf18 100644
--- a/assignIn.js
+++ b/assignIn.js
@@ -32,18 +32,18 @@ var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');
* @example
*
* function Foo() {
- * this.b = 2;
+ * this.a = 1;
* }
*
* function Bar() {
- * this.d = 4;
+ * this.c = 3;
* }
*
- * Foo.prototype.c = 3;
- * Bar.prototype.e = 5;
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
*
- * _.assignIn({ 'a': 1 }, new Foo, new Bar);
- * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5 }
+ * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
*/
var assignIn = createAssigner(function(object, source) {
if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {
diff --git a/at.js b/at.js
index 3f2ec0c00..5849a8caa 100644
--- a/at.js
+++ b/at.js
@@ -1,6 +1,6 @@
var baseAt = require('./_baseAt'),
baseFlatten = require('./_baseFlatten'),
- rest = require('./rest');
+ baseRest = require('./_baseRest');
/**
* Creates an array of values corresponding to `paths` of `object`.
@@ -19,7 +19,7 @@ var baseAt = require('./_baseAt'),
* _.at(object, ['a[0].b.c', 'a[1]']);
* // => [3, 4]
*/
-var at = rest(function(object, paths) {
+var at = baseRest(function(object, paths) {
return baseAt(object, baseFlatten(paths, 1));
});
diff --git a/attempt.js b/attempt.js
index e65b2e6f5..624d01524 100644
--- a/attempt.js
+++ b/attempt.js
@@ -1,6 +1,6 @@
var apply = require('./_apply'),
- isError = require('./isError'),
- rest = require('./rest');
+ baseRest = require('./_baseRest'),
+ isError = require('./isError');
/**
* Attempts to invoke `func`, returning either the result or the caught error
@@ -24,7 +24,7 @@ var apply = require('./_apply'),
* elements = [];
* }
*/
-var attempt = rest(function(func, args) {
+var attempt = baseRest(function(func, args) {
try {
return apply(func, undefined, args);
} catch (e) {
diff --git a/before.js b/before.js
index a495adcbd..87aff9490 100644
--- a/before.js
+++ b/before.js
@@ -18,7 +18,7 @@ var FUNC_ERROR_TEXT = 'Expected a function';
* @example
*
* jQuery(element).on('click', _.before(5, addContactToList));
- * // => allows adding up to 4 contacts to the list
+ * // => Allows adding up to 4 contacts to the list.
*/
function before(n, func) {
var result;
diff --git a/bind.js b/bind.js
index 893932a1d..eac913bf6 100644
--- a/bind.js
+++ b/bind.js
@@ -1,9 +1,9 @@
-var createWrapper = require('./_createWrapper'),
+var baseRest = require('./_baseRest'),
+ createWrap = require('./_createWrap'),
getHolder = require('./_getHolder'),
- replaceHolders = require('./_replaceHolders'),
- rest = require('./rest');
+ replaceHolders = require('./_replaceHolders');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1,
PARTIAL_FLAG = 32;
@@ -27,9 +27,9 @@ var BIND_FLAG = 1,
* @returns {Function} Returns the new bound function.
* @example
*
- * var greet = function(greeting, punctuation) {
+ * function greet(greeting, punctuation) {
* return greeting + ' ' + this.user + punctuation;
- * };
+ * }
*
* var object = { 'user': 'fred' };
*
@@ -42,13 +42,13 @@ var BIND_FLAG = 1,
* bound('hi');
* // => 'hi fred!'
*/
-var bind = rest(function(func, thisArg, partials) {
+var bind = baseRest(function(func, thisArg, partials) {
var bitmask = BIND_FLAG;
if (partials.length) {
var holders = replaceHolders(partials, getHolder(bind));
bitmask |= PARTIAL_FLAG;
}
- return createWrapper(func, bitmask, thisArg, partials, holders);
+ return createWrap(func, bitmask, thisArg, partials, holders);
});
// Assign default placeholders.
diff --git a/bindAll.js b/bindAll.js
index 7d1e9bac4..7d0d09d5a 100644
--- a/bindAll.js
+++ b/bindAll.js
@@ -1,7 +1,7 @@
var arrayEach = require('./_arrayEach'),
baseFlatten = require('./_baseFlatten'),
+ baseRest = require('./_baseRest'),
bind = require('./bind'),
- rest = require('./rest'),
toKey = require('./_toKey');
/**
@@ -21,16 +21,16 @@ var arrayEach = require('./_arrayEach'),
*
* var view = {
* 'label': 'docs',
- * 'onClick': function() {
+ * 'click': function() {
* console.log('clicked ' + this.label);
* }
* };
*
- * _.bindAll(view, ['onClick']);
- * jQuery(element).on('click', view.onClick);
+ * _.bindAll(view, ['click']);
+ * jQuery(element).on('click', view.click);
* // => Logs 'clicked docs' when clicked.
*/
-var bindAll = rest(function(object, methodNames) {
+var bindAll = baseRest(function(object, methodNames) {
arrayEach(baseFlatten(methodNames, 1), function(key) {
key = toKey(key);
object[key] = bind(object[key], object);
diff --git a/bindKey.js b/bindKey.js
index 1ed754be8..882444084 100644
--- a/bindKey.js
+++ b/bindKey.js
@@ -1,9 +1,9 @@
-var createWrapper = require('./_createWrapper'),
+var baseRest = require('./_baseRest'),
+ createWrap = require('./_createWrap'),
getHolder = require('./_getHolder'),
- replaceHolders = require('./_replaceHolders'),
- rest = require('./rest');
+ replaceHolders = require('./_replaceHolders');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1,
BIND_KEY_FLAG = 2,
PARTIAL_FLAG = 32;
@@ -53,13 +53,13 @@ var BIND_FLAG = 1,
* bound('hi');
* // => 'hiya fred!'
*/
-var bindKey = rest(function(object, key, partials) {
+var bindKey = baseRest(function(object, key, partials) {
var bitmask = BIND_FLAG | BIND_KEY_FLAG;
if (partials.length) {
var holders = replaceHolders(partials, getHolder(bindKey));
bitmask |= PARTIAL_FLAG;
}
- return createWrapper(key, bitmask, object, partials, holders);
+ return createWrap(key, bitmask, object, partials, holders);
});
// Assign default placeholders.
diff --git a/collection.js b/collection.js
index 22b0c8bce..77fe837f3 100644
--- a/collection.js
+++ b/collection.js
@@ -1,5 +1,4 @@
module.exports = {
- 'at': require('./at'),
'countBy': require('./countBy'),
'each': require('./each'),
'eachRight': require('./eachRight'),
diff --git a/cond.js b/cond.js
index cdebd12a1..28955cefd 100644
--- a/cond.js
+++ b/cond.js
@@ -1,7 +1,7 @@
var apply = require('./_apply'),
arrayMap = require('./_arrayMap'),
baseIteratee = require('./_baseIteratee'),
- rest = require('./rest');
+ baseRest = require('./_baseRest');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
@@ -23,7 +23,7 @@ var FUNC_ERROR_TEXT = 'Expected a function';
* var func = _.cond([
* [_.matches({ 'a': 1 }), _.constant('matches A')],
* [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
- * [_.constant(true), _.constant('no match')]
+ * [_.stubTrue, _.constant('no match')]
* ]);
*
* func({ 'a': 1, 'b': 2 });
@@ -46,7 +46,7 @@ function cond(pairs) {
return [toIteratee(pair[0]), pair[1]];
});
- return rest(function(args) {
+ return baseRest(function(args) {
var index = -1;
while (++index < length) {
var pair = pairs[index];
diff --git a/conforms.js b/conforms.js
index 2a3915436..e6653c413 100644
--- a/conforms.js
+++ b/conforms.js
@@ -14,13 +14,13 @@ var baseClone = require('./_baseClone'),
* @returns {Function} Returns the new spec function.
* @example
*
- * var users = [
- * { 'user': 'barney', 'age': 36 },
- * { 'user': 'fred', 'age': 40 }
+ * var objects = [
+ * { 'a': 2, 'b': 1 },
+ * { 'a': 1, 'b': 2 }
* ];
*
- * _.filter(users, _.conforms({ 'age': function(n) { return n > 38; } }));
- * // => [{ 'user': 'fred', 'age': 40 }]
+ * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
+ * // => [{ 'a': 1, 'b': 2 }]
*/
function conforms(source) {
return baseConforms(baseClone(source, true));
diff --git a/conformsTo.js b/conformsTo.js
new file mode 100644
index 000000000..0e68f9497
--- /dev/null
+++ b/conformsTo.js
@@ -0,0 +1,30 @@
+var baseConformsTo = require('./_baseConformsTo'),
+ keys = require('./keys');
+
+/**
+ * Checks if `object` conforms to `source` by invoking the predicate properties
+ * of `source` with the corresponding property values of `object`. This method
+ * is equivalent to a `_.conforms` function when `source` is partially applied.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.14.0
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ *
+ * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
+ * // => true
+ *
+ * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
+ * // => false
+ */
+function conformsTo(object, source) {
+ return source == null || baseConformsTo(object, source, keys(source));
+}
+
+module.exports = conformsTo;
diff --git a/core.js b/core.js
index 9b6092dd9..44613ae9d 100644
--- a/core.js
+++ b/core.js
@@ -13,12 +13,12 @@
var undefined;
/** Used as the semantic version number. */
- var VERSION = '4.13.1';
+ var VERSION = '4.14.0';
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
- /** Used to compose bitmasks for wrapper metadata. */
+ /** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1,
PARTIAL_FLAG = 32;
@@ -57,24 +57,21 @@
'`': '`'
};
+ /** Detect free variable `global` from Node.js. */
+ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+ /** Detect free variable `self`. */
+ var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+ /** Used as a reference to the global object. */
+ var root = freeGlobal || freeSelf || Function('return this')();
+
/** Detect free variable `exports`. */
- var freeExports = typeof exports == 'object' && exports;
+ var freeExports = freeGlobal && typeof exports == 'object' && exports;
/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module;
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = checkGlobal(typeof global == 'object' && global);
-
- /** Detect free variable `self`. */
- var freeSelf = checkGlobal(typeof self == 'object' && self);
-
- /** Detect `this` as the global object. */
- var thisGlobal = checkGlobal(typeof this == 'object' && this);
-
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || thisGlobal || Function('return this')();
-
/*--------------------------------------------------------------------------*/
/**
@@ -113,6 +110,32 @@
return -1;
}
+ /**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new accessor function.
+ */
+ function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined : object[key];
+ };
+ }
+
+ /**
+ * The base implementation of `_.propertyOf` without support for deep paths.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Function} Returns the new accessor function.
+ */
+ function basePropertyOf(object) {
+ return function(key) {
+ return object == null ? undefined : object[key];
+ };
+ }
+
/**
* The base implementation of `_.reduce` and `_.reduceRight`, without support
* for iteratee shorthands, which iterates over `collection` using `eachFunc`.
@@ -151,17 +174,6 @@
});
}
- /**
- * Checks if `value` is a global object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {null|Object} Returns `value` if it's a global object, else `null`.
- */
- function checkGlobal(value) {
- return (value && value.Object === Object) ? value : null;
- }
-
/**
* Used by `_.escape` to convert characters to HTML entities.
*
@@ -169,9 +181,7 @@
* @param {string} chr The matched character to escape.
* @returns {string} Returns the escaped character.
*/
- function escapeHtmlChar(chr) {
- return htmlEscapes[chr];
- }
+ var escapeHtmlChar = basePropertyOf(htmlEscapes);
/**
* Checks if `value` is a host object in IE < 9.
@@ -184,6 +194,20 @@
return false;
}
+ /**
+ * Creates a function that invokes `func` with its first argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
+ function overArg(func, transform) {
+ return function(arg) {
+ return func(transform(arg));
+ };
+ }
+
/*--------------------------------------------------------------------------*/
/** Used for built-in method references. */
@@ -283,16 +307,16 @@
*
* The wrapper methods that are **not** chainable by default are:
* `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
- * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `deburr`, `divide`, `each`,
- * `eachRight`, `endsWith`, `eq`, `escape`, `escapeRegExp`, `every`, `find`,
- * `findIndex`, `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `first`,
- * `floor`, `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`,
- * `forOwnRight`, `get`, `gt`, `gte`, `has`, `hasIn`, `head`, `identity`,
- * `includes`, `indexOf`, `inRange`, `invoke`, `isArguments`, `isArray`,
- * `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`,
- * `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`,
- * `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMap`,
- * `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
+ * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
+ * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
+ * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
+ * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
+ * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
+ * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
+ * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
+ * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
+ * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
+ * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
* `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
* `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
* `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
@@ -407,13 +431,13 @@
}
/**
- * The base implementation of `_.delay` and `_.defer` which accepts an array
- * of `func` arguments.
+ * The base implementation of `_.delay` and `_.defer` which accepts `args`
+ * to provide to `func`.
*
* @private
* @param {Function} func The function to delay.
* @param {number} wait The number of milliseconds to delay invocation.
- * @param {Object} args The arguments to provide to `func`.
+ * @param {Array} args The arguments to provide to `func`.
* @returns {number} Returns the timer id.
*/
function baseDelay(func, wait, args) {
@@ -573,7 +597,7 @@
}
/**
- * The base implementation of `_.gt` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.gt` which doesn't coerce arguments.
*
* @private
* @param {*} value The value to compare.
@@ -585,6 +609,17 @@
return value > other;
}
+ /**
+ * The base implementation of `_.isDate` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+ */
+ function baseIsDate(value) {
+ return isObjectLike(value) && objectToString.call(value) == dateTag;
+ }
+
/**
* The base implementation of `_.isEqual` which supports partial comparisons
* and tracks traversed objects.
@@ -644,13 +679,17 @@
isSameTag = objTag == othTag;
stack || (stack = []);
- var stacked = find(stack, function(entry) {
- return entry[0] === object;
+ var objStack = find(stack, function(entry) {
+ return entry[0] == object;
});
- if (stacked && stacked[1]) {
- return stacked[1] == other;
+ var othStack = find(stack, function(entry) {
+ return entry[0] == other;
+ });
+ if (objStack && othStack) {
+ return objStack[1] == other;
}
stack.push([object, other]);
+ stack.push([other, object]);
if (isSameTag && !objIsObj) {
var result = (objIsArr)
? equalArrays(object, other, equalFunc, customizer, bitmask, stack)
@@ -679,6 +718,17 @@
return result;
}
+ /**
+ * The base implementation of `_.isRegExp` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+ */
+ function baseIsRegExp(value) {
+ return isObject(value) && objectToString.call(value) == regexpTag;
+ }
+
/**
* The base implementation of `_.iteratee`.
*
@@ -704,9 +754,7 @@
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
- function baseKeys(object) {
- return nativeKeys(Object(object));
- }
+ var baseKeys = overArg(nativeKeys, Object);
/**
* The base implementation of `_.keysIn` which doesn't skip the constructor
@@ -727,7 +775,7 @@
}
/**
- * The base implementation of `_.lt` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.lt` which doesn't coerce arguments.
*
* @private
* @param {*} value The value to compare.
@@ -804,15 +852,31 @@
}
/**
- * The base implementation of `_.property` without support for deep paths.
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
*
* @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new accessor function.
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
*/
- function baseProperty(key) {
- return function(object) {
- return object == null ? undefined : object[key];
+ function baseRest(func, start) {
+ start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+ return function() {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ array = Array(length);
+
+ while (++index < length) {
+ array[index] = args[start + index];
+ }
+ index = -1;
+ var otherArgs = Array(start + 1);
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = array;
+ return func.apply(this, otherArgs);
};
}
@@ -953,9 +1017,9 @@
var newValue = customizer
? customizer(object[key], source[key], key, object, source)
- : source[key];
+ : undefined;
- assignValue(object, key, newValue);
+ assignValue(object, key, newValue === undefined ? source[key] : newValue);
}
return object;
}
@@ -968,7 +1032,7 @@
* @returns {Function} Returns the new assigner function.
*/
function createAssigner(assigner) {
- return rest(function(object, sources) {
+ return baseRest(function(object, sources) {
var index = -1,
length = sources.length,
customizer = length > 1 ? sources[length - 1] : undefined;
@@ -1049,7 +1113,7 @@
* @param {Function} Ctor The constructor to wrap.
* @returns {Function} Returns the new wrapped function.
*/
- function createCtorWrapper(Ctor) {
+ function createCtor(Ctor) {
return function() {
// Use a `switch` statement to work with class constructors. See
// http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
@@ -1074,18 +1138,13 @@
function createFind(findIndexFunc) {
return function(collection, predicate, fromIndex) {
var iterable = Object(collection);
- predicate = baseIteratee(predicate, 3);
if (!isArrayLike(collection)) {
- var props = keys(collection);
+ var iteratee = baseIteratee(predicate, 3);
+ collection = keys(collection);
+ predicate = function(key) { return iteratee(iterable[key], key, iterable); };
}
- var index = findIndexFunc(props || collection, function(value, key) {
- if (props) {
- key = value;
- value = iterable[key];
- }
- return predicate(value, key, iterable);
- }, fromIndex);
- return index > -1 ? collection[props ? props[index] : index] : undefined;
+ var index = findIndexFunc(collection, predicate, fromIndex);
+ return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
};
}
@@ -1095,19 +1154,18 @@
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {*} thisArg The `this` binding of `func`.
* @param {Array} partials The arguments to prepend to those provided to
* the new function.
* @returns {Function} Returns the new wrapped function.
*/
- function createPartialWrapper(func, bitmask, thisArg, partials) {
+ function createPartial(func, bitmask, thisArg, partials) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
var isBind = bitmask & BIND_FLAG,
- Ctor = createCtorWrapper(func);
+ Ctor = createCtor(func);
function wrapper() {
var argsIndex = -1,
@@ -1212,18 +1270,14 @@
case boolTag:
case dateTag:
- // Coerce dates and booleans to numbers, dates to milliseconds and
- // booleans to `1` or `0` treating invalid dates coerced to `NaN` as
- // not equal.
- return +object == +other;
+ case numberTag:
+ // Coerce booleans to `1` or `0` and dates to milliseconds.
+ // Invalid dates are coerced to `NaN`.
+ return eq(+object, +other);
case errorTag:
return object.name == other.name && object.message == other.message;
- case numberTag:
- // Treat `NaN` vs. `NaN` as equal.
- return (object != +object) ? other != +other : object == +other;
-
case regexpTag:
case stringTag:
// Coerce regexes to strings and treat strings, primitives and objects,
@@ -1399,7 +1453,7 @@
* @since 1.1.0
* @category Array
* @param {Array} array The array to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=0] The index to search from.
* @returns {number} Returns the index of the found element, else `-1`.
@@ -1735,7 +1789,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
* @returns {boolean} Returns `true` if all elements pass the predicate check,
@@ -1772,12 +1826,14 @@
* `predicate` returns truthy for. The predicate is invoked with three
* arguments: (value, index|key, collection).
*
+ * **Note:** Unlike `_.remove`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new filtered array.
* @see _.reject
@@ -1817,7 +1873,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=0] The index to search from.
* @returns {*} Returns the matched element, else `undefined`.
@@ -1899,8 +1955,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
* @example
*
@@ -2007,8 +2062,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
* @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
@@ -2050,8 +2104,8 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [iteratees=[_.identity]] The iteratees to sort by.
+ * @param {...(Function|Function[])} [iteratees=[_.identity]]
+ * The iteratees to sort by.
* @returns {Array} Returns the new sorted array.
* @example
*
@@ -2101,7 +2155,7 @@
* @example
*
* jQuery(element).on('click', _.before(5, addContactToList));
- * // => allows adding up to 4 contacts to the list
+ * // => Allows adding up to 4 contacts to the list.
*/
function before(n, func) {
var result;
@@ -2140,9 +2194,9 @@
* @returns {Function} Returns the new bound function.
* @example
*
- * var greet = function(greeting, punctuation) {
+ * function greet(greeting, punctuation) {
* return greeting + ' ' + this.user + punctuation;
- * };
+ * }
*
* var object = { 'user': 'fred' };
*
@@ -2155,8 +2209,8 @@
* bound('hi');
* // => 'hi fred!'
*/
- var bind = rest(function(func, thisArg, partials) {
- return createPartialWrapper(func, BIND_FLAG | PARTIAL_FLAG, thisArg, partials);
+ var bind = baseRest(function(func, thisArg, partials) {
+ return createPartial(func, BIND_FLAG | PARTIAL_FLAG, thisArg, partials);
});
/**
@@ -2177,7 +2231,7 @@
* }, 'deferred');
* // => Logs 'deferred' after one or more milliseconds.
*/
- var defer = rest(function(func, args) {
+ var defer = baseRest(function(func, args) {
return baseDelay(func, 1, args);
});
@@ -2200,7 +2254,7 @@
* }, 1000, 'later');
* // => Logs 'later' after one second.
*/
- var delay = rest(function(func, wait, args) {
+ var delay = baseRest(function(func, wait, args) {
return baseDelay(func, toNumber(wait) || 0, args);
});
@@ -2229,7 +2283,8 @@
throw new TypeError(FUNC_ERROR_TEXT);
}
return function() {
- return !predicate.apply(this, arguments);
+ var args = arguments;
+ return !predicate.apply(this, args);
};
}
@@ -2249,61 +2304,12 @@
* var initialize = _.once(createApplication);
* initialize();
* initialize();
- * // `initialize` invokes `createApplication` once
+ * // => `createApplication` is invoked once
*/
function once(func) {
return before(2, func);
}
- /**
- * Creates a function that invokes `func` with the `this` binding of the
- * created function and arguments from `start` and beyond provided as
- * an array.
- *
- * **Note:** This method is based on the
- * [rest parameter](https://mdn.io/rest_parameters).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Function
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var say = _.rest(function(what, names) {
- * return what + ' ' + _.initial(names).join(', ') +
- * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
- * });
- *
- * say('hello', 'fred', 'barney', 'pebbles');
- * // => 'hello fred, barney, & pebbles'
- */
- function rest(func, start) {
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);
- return function() {
- var args = arguments,
- index = -1,
- length = nativeMax(args.length - start, 0),
- array = Array(length);
-
- while (++index < length) {
- array[index] = args[start + index];
- }
- var otherArgs = Array(start + 1);
- index = -1;
- while (++index < start) {
- otherArgs[index] = args[index];
- }
- otherArgs[start] = array;
- return func.apply(this, otherArgs);
- };
- }
-
/*------------------------------------------------------------------------*/
/**
@@ -2353,8 +2359,8 @@
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
- * var object = { 'user': 'fred' };
- * var other = { 'user': 'fred' };
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
*
* _.eq(object, object);
* // => true
@@ -2383,7 +2389,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
* else `false`.
* @example
*
@@ -2405,11 +2411,9 @@
* @static
* @memberOf _
* @since 0.1.0
- * @type {Function}
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
@@ -2492,8 +2496,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
* @example
*
* _.isBoolean(false);
@@ -2515,8 +2518,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
* @example
*
* _.isDate(new Date);
@@ -2525,9 +2527,7 @@
* _.isDate('Mon April 23 2012');
* // => false
*/
- function isDate(value) {
- return isObjectLike(value) && objectToString.call(value) == dateTag;
- }
+ var isDate = baseIsDate;
/**
* Checks if `value` is an empty object, collection, map, or set.
@@ -2591,8 +2591,8 @@
* else `false`.
* @example
*
- * var object = { 'user': 'fred' };
- * var other = { 'user': 'fred' };
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
*
* _.isEqual(object, other);
* // => true
@@ -2643,8 +2643,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
@@ -2818,8 +2817,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a number, else `false`.
* @example
*
* _.isNumber(3);
@@ -2847,8 +2845,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
* @example
*
* _.isRegExp(/abc/);
@@ -2857,9 +2854,7 @@
* _.isRegExp('/abc/');
* // => false
*/
- function isRegExp(value) {
- return isObject(value) && objectToString.call(value) == regexpTag;
- }
+ var isRegExp = baseIsRegExp;
/**
* Checks if `value` is classified as a `String` primitive or object.
@@ -2869,8 +2864,7 @@
* @memberOf _
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a string, else `false`.
* @example
*
* _.isString('abc');
@@ -3037,18 +3031,18 @@
* @example
*
* function Foo() {
- * this.c = 3;
+ * this.a = 1;
* }
*
* function Bar() {
- * this.e = 5;
+ * this.c = 3;
* }
*
- * Foo.prototype.d = 4;
- * Bar.prototype.f = 6;
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
*
- * _.assign({ 'a': 1 }, new Foo, new Bar);
- * // => { 'a': 1, 'c': 3, 'e': 5 }
+ * _.assign({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'c': 3 }
*/
var assign = createAssigner(function(object, source) {
copyObject(source, keys(source), object);
@@ -3072,18 +3066,18 @@
* @example
*
* function Foo() {
- * this.b = 2;
+ * this.a = 1;
* }
*
* function Bar() {
- * this.d = 4;
+ * this.c = 3;
* }
*
- * Foo.prototype.c = 3;
- * Bar.prototype.e = 5;
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
*
- * _.assignIn({ 'a': 1 }, new Foo, new Bar);
- * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5 }
+ * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
*/
var assignIn = createAssigner(function(object, source) {
copyObject(source, keysIn(source), object);
@@ -3179,10 +3173,10 @@
* @see _.defaultsDeep
* @example
*
- * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
- * // => { 'user': 'barney', 'age': 36 }
+ * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
*/
- var defaults = rest(function(args) {
+ var defaults = baseRest(function(args) {
args.push(undefined, assignInDefaults);
return assignInWith.apply(undefined, args);
});
@@ -3290,7 +3284,7 @@
* _.pick(object, ['a', 'c']);
* // => { 'a': 1, 'c': 3 }
*/
- var pick = rest(function(object, props) {
+ var pick = baseRest(function(object, props) {
return object == null ? {} : basePick(object, baseMap(baseFlatten(props, 1), toKey));
});
@@ -3407,7 +3401,7 @@
/*------------------------------------------------------------------------*/
/**
- * This method returns the first argument given to it.
+ * This method returns the first argument it receives.
*
* @static
* @since 0.1.0
@@ -3417,7 +3411,7 @@
* @returns {*} Returns `value`.
* @example
*
- * var object = { 'user': 'fred' };
+ * var object = { 'a': 1 };
*
* console.log(_.identity(object) === object);
* // => true
@@ -3486,13 +3480,13 @@
* @returns {Function} Returns the new spec function.
* @example
*
- * var users = [
- * { 'user': 'barney', 'age': 36, 'active': true },
- * { 'user': 'fred', 'age': 40, 'active': false }
+ * var objects = [
+ * { 'a': 1, 'b': 2, 'c': 3 },
+ * { 'a': 4, 'b': 5, 'c': 6 }
* ];
*
- * _.filter(users, _.matches({ 'age': 40, 'active': false }));
- * // => [{ 'user': 'fred', 'age': 40, 'active': false }]
+ * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
+ * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
*/
function matches(source) {
return baseMatches(assign({}, source));
@@ -3591,7 +3585,7 @@
}
/**
- * A method that returns `undefined`.
+ * This method returns `undefined`.
*
* @static
* @memberOf _
@@ -3801,22 +3795,21 @@
/*--------------------------------------------------------------------------*/
- // Expose Lodash on the free variable `window` or `self` when available so it's
- // globally accessible, even when bundled with Browserify, Webpack, etc. This
- // also prevents errors in cases where Lodash is loaded by a script tag in the
- // presence of an AMD loader. See http://requirejs.org/docs/errors.html#mismatch
- // for more details. Use `_.noConflict` to remove Lodash from the global object.
- (freeSelf || {})._ = lodash;
-
- // Some AMD build optimizers like r.js check for condition patterns like the following:
+ // Some AMD build optimizers, like r.js, check for condition patterns like:
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
+ // Expose Lodash on the global object to prevent errors when Lodash is
+ // loaded by a script tag in the presence of an AMD loader.
+ // See http://requirejs.org/docs/errors.html#mismatch for more details.
+ // Use `_.noConflict` to remove Lodash from the global object.
+ root._ = lodash;
+
// Define as an anonymous module so, through path mapping, it can be
// referenced as the "underscore" module.
define(function() {
return lodash;
});
}
- // Check for `exports` after `define` in case a build optimizer adds an `exports` object.
+ // Check for `exports` after `define` in case a build optimizer adds it.
else if (freeModule) {
// Export for Node.js.
(freeModule.exports = lodash)._ = lodash;
diff --git a/core.min.js b/core.min.js
index 96f15c212..4823456a6 100644
--- a/core.min.js
+++ b/core.min.js
@@ -3,26 +3,26 @@
* lodash (Custom Build) /license | Underscore.js 1.8.3 underscorejs.org/LICENSE
* Build: `lodash core -o ./dist/lodash.core.js`
*/
-;(function(){function n(n){n=null==n?n:Object(n);var t,r=[];for(t in n)r.push(t);return r}function t(n){return mn(Object(n))}function r(n,t){return n.push.apply(n,t),n}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return x(t,function(t){return n[t]})}function o(n){return n&&n.Object===Object?n:null}function i(n){return cn[n]}function c(n){return n instanceof f?n:new f(n)}function f(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function a(n,t,r,e){
-var u;return(u=n===rn)||(u=hn[r],u=(n===u||n!==n&&u!==u)&&!vn.call(e,r)),u?t:n}function l(n){return L(n)?_n(n):{}}function p(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");return setTimeout(function(){n.apply(rn,r)},t)}function s(n,t){var r=true;return xn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function h(n,t,r){for(var e=-1,u=n.length;++e0&&e(f)?t>1?y(f,t-1,e,u,o):r(o,f):u||(o[o.length]=f)}return o}function b(n,r){return n&&En(n,r,t)}function g(n,t){return v(t,function(t){return K(n[t])})}function _(n,t){return n>t}function j(n,t,r,e,u){return n===t?true:null==n||null==t||!L(n)&&!Q(t)?n!==n&&t!==t:d(n,t,j,r,e,u)}function d(n,t,r,e,u,o){var i=Tn(n),c=Tn(t),f="[object Array]",a="[object Array]";i||(f=bn.call(n),f="[object Arguments]"==f?"[object Object]":f),
-c||(a=bn.call(t),a="[object Arguments]"==a?"[object Object]":a);var l="[object Object]"==f&&true,c="[object Object]"==a&&true,a=f==a;o||(o=[]);var p=kn(o,function(t){return t[0]===n});return p&&p[1]?p[1]==t:(o.push([n,t]),a&&!l?(r=i?I(n,t,r,e,u,o):q(n,t,f),o.pop(),r):2&u||(i=l&&vn.call(n,"__wrapped__"),f=c&&vn.call(t,"__wrapped__"),!i&&!f)?a?(r=$(n,t,r,e,u,o),o.pop(),r):false:(i=i?n.value():n,t=f?t.value():t,r=r(i,t,e,u,o),o.pop(),r))}function m(n){return typeof n=="function"?n:null==n?nn:(typeof n=="object"?E:w)(n);
-}function O(n,t){return t>n}function x(n,t){var r=-1,e=H(n)?Array(n.length):[];return xn(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function E(n){var r=t(n);return function(t){var e=r.length;if(null==t)return!e;for(t=Object(t);e--;){var u=r[e];if(!(u in t&&j(n[u],t[u],rn,3)))return false}return true}}function A(n,t){return n=Object(n),M(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function w(n){return function(t){return null==t?rn:t[n]}}function k(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,
-0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e1?r[u-1]:rn,o=n.length>3&&typeof o=="function"?(u--,
-o):rn;for(t=Object(t);++ei))return false;for(var c=-1,f=true,a=1&u?[]:rn;++cr?On(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++rarguments.length,xn)}function P(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Bn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=rn),r}}function U(n){var t;if(typeof n!="function")throw new TypeError("Expected a function");
-return t=On(t===rn?n.length-1:Bn(t),0),function(){for(var r=arguments,e=-1,u=On(r.length-t,0),o=Array(u);++e-1&&0==t%1&&9007199254740991>=t),t&&!K(n)}function K(n){return n=L(n)?bn.call(n):"","[object Function]"==n||"[object GeneratorFunction]"==n;
-}function L(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function Q(n){return!!n&&typeof n=="object"}function W(n){return typeof n=="number"||Q(n)&&"[object Number]"==bn.call(n)}function X(n){return typeof n=="string"||!Tn(n)&&Q(n)&&"[object String]"==bn.call(n)}function Y(n){return typeof n=="string"?n:null==n?"":n+""}function Z(n){return n?u(n,t(n)):[]}function nn(n){return n}function tn(n,e,u){var o=t(e),i=g(e,o);null!=u||L(e)&&(i.length||!o.length)||(u=e,e=n,n=this,i=g(e,t(e)));var c=!(L(u)&&"chain"in u&&!u.chain),f=K(n);
-return xn(i,function(t){var u=e[t];n[t]=u,f&&(n.prototype[t]=function(){var t=this.__chain__;if(c||t){var e=n(this.__wrapped__);return(e.__actions__=N(this.__actions__)).push({func:u,args:arguments,thisArg:n}),e.__chain__=t,e}return u.apply(n,r([this.value()],arguments))})}),n}var rn,en=1/0,un=/[&<>"'`]/g,on=RegExp(un.source),cn={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},fn=typeof exports=="object"&&exports,an=fn&&typeof module=="object"&&module,ln=o(typeof self=="object"&&self),pn=o(typeof global=="object"&&global)||ln||o(typeof this=="object"&&this)||Function("return this")(),sn=Array.prototype,hn=Object.prototype,vn=hn.hasOwnProperty,yn=0,bn=hn.toString,gn=pn._,_n=Object.create,jn=hn.propertyIsEnumerable,dn=pn.isFinite,mn=Object.keys,On=Math.max;
-f.prototype=l(c.prototype),f.prototype.constructor=f;var xn=function(n,t){return function(r,e){if(null==r)return r;if(!H(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o-1?r[i?i[u]:u]:rn}}(function(n,t,r){var e=n?n.length:0;if(!e)return-1;r=null==r?0:Bn(r),0>r&&(r=On(e+r,0));n:{for(t=m(t),e=n.length,r+=-1;++re||o&&c&&a||!u&&a||!i){r=1;break n}if(!o&&e>r||f&&u&&i||!c&&i||!a){r=-1;break n}}r=0}return r||n.index-t.index}),w("value"))},c.tap=function(n,t){return t(n),n},c.thru=function(n,t){return t(n)},c.toArray=function(n){return H(n)?n.length?N(n):[]:Z(n)},c.values=Z,c.extend=In,
-tn(c,c),c.clone=function(n){return L(n)?Tn(n)?N(n):T(n,t(n)):n},c.escape=function(n){return(n=Y(n))&&on.test(n)?n.replace(un,i):n},c.every=function(n,t,r){return t=r?rn:t,s(n,m(t))},c.find=kn,c.forEach=J,c.has=function(n,t){return null!=n&&vn.call(n,t)},c.head=C,c.identity=nn,c.indexOf=G,c.isArguments=V,c.isArray=Tn,c.isBoolean=function(n){return true===n||false===n||Q(n)&&"[object Boolean]"==bn.call(n)},c.isDate=function(n){return Q(n)&&"[object Date]"==bn.call(n)},c.isEmpty=function(n){return H(n)&&(Tn(n)||X(n)||K(n.splice)||V(n))?!n.length:!t(n).length;
-},c.isEqual=function(n,t){return j(n,t)},c.isFinite=function(n){return typeof n=="number"&&dn(n)},c.isFunction=K,c.isNaN=function(n){return W(n)&&n!=+n},c.isNull=function(n){return null===n},c.isNumber=W,c.isObject=L,c.isRegExp=function(n){return L(n)&&"[object RegExp]"==bn.call(n)},c.isString=X,c.isUndefined=function(n){return n===rn},c.last=function(n){var t=n?n.length:0;return t?n[t-1]:rn},c.max=function(n){return n&&n.length?h(n,nn,_):rn},c.min=function(n){return n&&n.length?h(n,nn,O):rn},c.noConflict=function(){
-return pn._===this&&(pn._=gn),this},c.noop=function(){},c.reduce=M,c.result=function(n,t,r){return t=null==n?rn:n[t],t===rn&&(t=r),K(t)?t.call(n):t},c.size=function(n){return null==n?0:(n=H(n)?n:t(n),n.length)},c.some=function(n,t,r){return t=r?rn:t,S(n,m(t))},c.uniqueId=function(n){var t=++yn;return Y(n)+t},c.each=J,c.first=C,tn(c,function(){var n={};return b(c,function(t,r){vn.call(c.prototype,r)||(n[r]=t)}),n}(),{chain:false}),c.VERSION="4.13.1",xn("pop join replace reverse split push shift sort splice unshift".split(" "),function(n){
-var t=(/^(?:replace|split)$/.test(n)?String.prototype:sn)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|join|replace|shift)$/.test(n);c.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(Tn(u)?u:[],n)}return this[r](function(r){return t.apply(Tn(r)?r:[],n)})}}),c.prototype.toJSON=c.prototype.valueOf=c.prototype.value=function(){return F(this.__wrapped__,this.__actions__)},(ln||{})._=c,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){
-return c}):an?((an.exports=c)._=c,fn._=c):pn._=c}).call(this);
\ No newline at end of file
+;(function(){function n(n){n=null==n?n:Object(n);var t,r=[];for(t in n)r.push(t);return r}function t(n,t){return n.push.apply(n,t),n}function r(n){return function(t){return null==t?Z:t[n]}}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return m(t,function(t){return n[t]})}function o(n){return n instanceof i?n:new i(n)}function i(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function c(n,t,r,e){return n===Z||J(n,an[r])&&!ln.call(e,r)?t:n;
+}function f(n){return V(n)?vn(n):{}}function a(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");return setTimeout(function(){n.apply(Z,r)},t)}function l(n,t){var r=true;return jn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function p(n,t,r){for(var e=-1,u=n.length;++et}function g(n,t,r,e,u){return n===t||(null==n||null==t||!V(n)&&!H(t)?n!==n&&t!==t:_(n,t,g,r,e,u))}function _(n,t,r,e,u,o){var i=kn(n),c=kn(t),f="[object Array]",a="[object Array]";i||(f=sn.call(n),f="[object Arguments]"==f?"[object Object]":f),c||(a=sn.call(t),a="[object Arguments]"==a?"[object Object]":a);
+var l="[object Object]"==f&&true,c="[object Object]"==a&&true,a=f==a;o||(o=[]);var p=An(o,function(t){return t[0]==n}),s=An(o,function(n){return n[0]==t});if(p&&s)return p[1]==t;if(o.push([n,t]),o.push([t,n]),a&&!l){if(i)r=T(n,t,r,e,u,o);else n:{switch(f){case"[object Boolean]":case"[object Date]":case"[object Number]":r=J(+n,+t);break n;case"[object Error]":r=n.name==t.name&&n.message==t.message;break n;case"[object RegExp]":case"[object String]":r=n==t+"";break n}r=false}return o.pop(),r}return 2&u||(i=l&&ln.call(n,"__wrapped__"),
+f=c&&ln.call(t,"__wrapped__"),!i&&!f)?!!a&&(r=D(n,t,r,e,u,o),o.pop(),r):(i=i?n.value():n,f=f?t.value():t,r=r(i,f,e,u,o),o.pop(),r)}function j(n){return typeof n=="function"?n:null==n?X:(typeof n=="object"?O:r)(n)}function d(n,t){return nt&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++ei))return false;for(var c=-1,f=true,a=1&u?[]:Z;++cr?_n(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++rarguments.length,jn)}function G(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Nn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=Z),r}}function J(n,t){
+return n===t||n!==n&&t!==t}function M(n){return H(n)&&P(n)&&ln.call(n,"callee")&&(!bn.call(n,"callee")||"[object Arguments]"==sn.call(n))}function P(n){var t;return(t=null!=n)&&(t=On(n),t=typeof t=="number"&&-1=t),t&&!U(n)}function U(n){return n=V(n)?sn.call(n):"","[object Function]"==n||"[object GeneratorFunction]"==n}function V(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function H(n){return!!n&&typeof n=="object"}function K(n){return typeof n=="number"||H(n)&&"[object Number]"==sn.call(n);
+}function L(n){return typeof n=="string"||!kn(n)&&H(n)&&"[object String]"==sn.call(n)}function Q(n){return typeof n=="string"?n:null==n?"":n+""}function W(n){return n?u(n,Dn(n)):[]}function X(n){return n}function Y(n,r,e){var u=Dn(r),o=b(r,u);null!=e||V(r)&&(o.length||!u.length)||(e=r,r=n,n=this,o=b(r,Dn(r)));var i=!(V(e)&&"chain"in e&&!e.chain),c=U(n);return jn(o,function(e){var u=r[e];n[e]=u,c&&(n.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=n(this.__wrapped__);return(e.__actions__=w(this.__actions__)).push({
+func:u,args:arguments,thisArg:n}),e.__chain__=r,e}return u.apply(n,t([this.value()],arguments))})}),n}var Z,nn=1/0,tn=/[&<>"'`]/g,rn=RegExp(tn.source),en=typeof global=="object"&&global&&global.Object===Object&&global,un=typeof self=="object"&&self&&self.Object===Object&&self,on=en||un||Function("return this")(),un=(en=en&&typeof exports=="object"&&exports)&&typeof module=="object"&&module,cn=function(n){return function(t){return null==n?Z:n[t]}}({"&":"&","<":"<",">":">",'"':""","'":"'",
+"`":"`"}),fn=Array.prototype,an=Object.prototype,ln=an.hasOwnProperty,pn=0,sn=an.toString,hn=on._,vn=Object.create,bn=an.propertyIsEnumerable,yn=on.isFinite,gn=Object.keys,_n=Math.max;i.prototype=f(o.prototype),i.prototype.constructor=i;var jn=function(n,t){return function(r,e){if(null==r)return r;if(!P(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++or&&(r=_n(e+r,0));n:{for(t=j(t),e=n.length,r+=-1;++re||o&&c&&a||!u&&a||!i){r=1;break n}if(!o&&r 1
+ *
+ * _.defaultTo(undefined, 10);
+ * // => 10
+ */
+function defaultTo(value, defaultValue) {
+ return (value == null || value !== value) ? defaultValue : value;
+}
+
+module.exports = defaultTo;
diff --git a/defaults.js b/defaults.js
index 099d2e97d..5333b4256 100644
--- a/defaults.js
+++ b/defaults.js
@@ -1,7 +1,7 @@
var apply = require('./_apply'),
assignInDefaults = require('./_assignInDefaults'),
assignInWith = require('./assignInWith'),
- rest = require('./rest');
+ baseRest = require('./_baseRest');
/**
* Assigns own and inherited enumerable string keyed properties of source
@@ -21,10 +21,10 @@ var apply = require('./_apply'),
* @see _.defaultsDeep
* @example
*
- * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
- * // => { 'user': 'barney', 'age': 36 }
+ * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
*/
-var defaults = rest(function(args) {
+var defaults = baseRest(function(args) {
args.push(undefined, assignInDefaults);
return apply(assignInWith, undefined, args);
});
diff --git a/defaultsDeep.js b/defaultsDeep.js
index b6447f78c..41680ed2d 100644
--- a/defaultsDeep.js
+++ b/defaultsDeep.js
@@ -1,7 +1,7 @@
var apply = require('./_apply'),
+ baseRest = require('./_baseRest'),
mergeDefaults = require('./_mergeDefaults'),
- mergeWith = require('./mergeWith'),
- rest = require('./rest');
+ mergeWith = require('./mergeWith');
/**
* This method is like `_.defaults` except that it recursively assigns
@@ -19,11 +19,10 @@ var apply = require('./_apply'),
* @see _.defaults
* @example
*
- * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
- * // => { 'user': { 'name': 'barney', 'age': 36 } }
- *
+ * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
+ * // => { 'a': { 'b': 2, 'c': 3 } }
*/
-var defaultsDeep = rest(function(args) {
+var defaultsDeep = baseRest(function(args) {
args.push(undefined, mergeDefaults);
return apply(mergeWith, undefined, args);
});
diff --git a/defer.js b/defer.js
index b096f71b5..351f630bc 100644
--- a/defer.js
+++ b/defer.js
@@ -1,5 +1,5 @@
var baseDelay = require('./_baseDelay'),
- rest = require('./rest');
+ baseRest = require('./_baseRest');
/**
* Defers invoking the `func` until the current call stack has cleared. Any
@@ -19,7 +19,7 @@ var baseDelay = require('./_baseDelay'),
* }, 'deferred');
* // => Logs 'deferred' after one or more milliseconds.
*/
-var defer = rest(function(func, args) {
+var defer = baseRest(function(func, args) {
return baseDelay(func, 1, args);
});
diff --git a/delay.js b/delay.js
index cac90a9bc..bd554796f 100644
--- a/delay.js
+++ b/delay.js
@@ -1,5 +1,5 @@
var baseDelay = require('./_baseDelay'),
- rest = require('./rest'),
+ baseRest = require('./_baseRest'),
toNumber = require('./toNumber');
/**
@@ -21,7 +21,7 @@ var baseDelay = require('./_baseDelay'),
* }, 1000, 'later');
* // => Logs 'later' after one second.
*/
-var delay = rest(function(func, wait, args) {
+var delay = baseRest(function(func, wait, args) {
return baseDelay(func, toNumber(wait) || 0, args);
});
diff --git a/difference.js b/difference.js
index bd52f54ea..8c4af3dca 100644
--- a/difference.js
+++ b/difference.js
@@ -1,14 +1,16 @@
var baseDifference = require('./_baseDifference'),
baseFlatten = require('./_baseFlatten'),
- isArrayLikeObject = require('./isArrayLikeObject'),
- rest = require('./rest');
+ baseRest = require('./_baseRest'),
+ isArrayLikeObject = require('./isArrayLikeObject');
/**
- * Creates an array of unique `array` values not included in the other given
- * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * Creates an array of `array` values not included in the other given arrays
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons. The order of result values is determined by the
* order they occur in the first array.
*
+ * **Note:** Unlike `_.pullAll`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 0.1.0
@@ -22,7 +24,7 @@ var baseDifference = require('./_baseDifference'),
* _.difference([2, 1], [2, 3]);
* // => [1]
*/
-var difference = rest(function(array, values) {
+var difference = baseRest(function(array, values) {
return isArrayLikeObject(array)
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
: [];
diff --git a/differenceBy.js b/differenceBy.js
index bbafa3272..16fa097a7 100644
--- a/differenceBy.js
+++ b/differenceBy.js
@@ -1,9 +1,9 @@
var baseDifference = require('./_baseDifference'),
baseFlatten = require('./_baseFlatten'),
baseIteratee = require('./_baseIteratee'),
+ baseRest = require('./_baseRest'),
isArrayLikeObject = require('./isArrayLikeObject'),
- last = require('./last'),
- rest = require('./rest');
+ last = require('./last');
/**
* This method is like `_.difference` except that it accepts `iteratee` which
@@ -11,14 +11,15 @@ var baseDifference = require('./_baseDifference'),
* by which they're compared. Result values are chosen from the first array.
* The iteratee is invoked with one argument: (value).
*
+ * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 4.0.0
* @category Array
* @param {Array} array The array to inspect.
* @param {...Array} [values] The values to exclude.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {Array} Returns the new array of filtered values.
* @example
*
@@ -29,13 +30,13 @@ var baseDifference = require('./_baseDifference'),
* _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
* // => [{ 'x': 2 }]
*/
-var differenceBy = rest(function(array, values) {
+var differenceBy = baseRest(function(array, values) {
var iteratee = last(values);
if (isArrayLikeObject(iteratee)) {
iteratee = undefined;
}
return isArrayLikeObject(array)
- ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), baseIteratee(iteratee))
+ ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2))
: [];
});
diff --git a/differenceWith.js b/differenceWith.js
index 6ae89865e..82ecc95fc 100644
--- a/differenceWith.js
+++ b/differenceWith.js
@@ -1,8 +1,8 @@
var baseDifference = require('./_baseDifference'),
baseFlatten = require('./_baseFlatten'),
+ baseRest = require('./_baseRest'),
isArrayLikeObject = require('./isArrayLikeObject'),
- last = require('./last'),
- rest = require('./rest');
+ last = require('./last');
/**
* This method is like `_.difference` except that it accepts `comparator`
@@ -10,6 +10,8 @@ var baseDifference = require('./_baseDifference'),
* are chosen from the first array. The comparator is invoked with two arguments:
* (arrVal, othVal).
*
+ * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 4.0.0
@@ -25,7 +27,7 @@ var baseDifference = require('./_baseDifference'),
* _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
* // => [{ 'x': 2, 'y': 1 }]
*/
-var differenceWith = rest(function(array, values) {
+var differenceWith = baseRest(function(array, values) {
var comparator = last(values);
if (isArrayLikeObject(comparator)) {
comparator = undefined;
diff --git a/divide.js b/divide.js
index 2889d7992..8cae0cd1b 100644
--- a/divide.js
+++ b/divide.js
@@ -17,6 +17,6 @@ var createMathOperation = require('./_createMathOperation');
*/
var divide = createMathOperation(function(dividend, divisor) {
return dividend / divisor;
-});
+}, 1);
module.exports = divide;
diff --git a/dropRightWhile.js b/dropRightWhile.js
index 98f457b81..9ad36a044 100644
--- a/dropRightWhile.js
+++ b/dropRightWhile.js
@@ -11,8 +11,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 3.0.0
* @category Array
* @param {Array} array The array to query.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {Array} Returns the slice of `array`.
* @example
*
diff --git a/dropWhile.js b/dropWhile.js
index 94f76e019..f89444ed4 100644
--- a/dropWhile.js
+++ b/dropWhile.js
@@ -11,7 +11,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 3.0.0
* @category Array
* @param {Array} array The array to query.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the slice of `array`.
* @example
diff --git a/endsWith.js b/endsWith.js
index bf10f2562..dc43484f2 100644
--- a/endsWith.js
+++ b/endsWith.js
@@ -35,8 +35,9 @@ function endsWith(string, target, position) {
? length
: baseClamp(toInteger(position), 0, length);
+ var end = position;
position -= target.length;
- return position >= 0 && string.indexOf(target, position) == position;
+ return position >= 0 && string.slice(position, end) == target;
}
module.exports = endsWith;
diff --git a/eq.js b/eq.js
index e9445d4fa..b821483fa 100644
--- a/eq.js
+++ b/eq.js
@@ -12,8 +12,8 @@
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
- * var object = { 'user': 'fred' };
- * var other = { 'user': 'fred' };
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
*
* _.eq(object, object);
* // => true
diff --git a/every.js b/every.js
index 14f68e744..96495bdeb 100644
--- a/every.js
+++ b/every.js
@@ -14,7 +14,7 @@ var arrayEvery = require('./_arrayEvery'),
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
* @returns {boolean} Returns `true` if all elements pass the predicate check,
diff --git a/filter.js b/filter.js
index 98e3a9640..3df977bb0 100644
--- a/filter.js
+++ b/filter.js
@@ -8,12 +8,14 @@ var arrayFilter = require('./_arrayFilter'),
* `predicate` returns truthy for. The predicate is invoked with three
* arguments: (value, index|key, collection).
*
+ * **Note:** Unlike `_.remove`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new filtered array.
* @see _.reject
diff --git a/find.js b/find.js
index 3e40bb6d2..88fb9ab37 100644
--- a/find.js
+++ b/find.js
@@ -11,7 +11,7 @@ var createFind = require('./_createFind'),
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=0] The index to search from.
* @returns {*} Returns the matched element, else `undefined`.
diff --git a/findIndex.js b/findIndex.js
index 83af981f5..224604a16 100644
--- a/findIndex.js
+++ b/findIndex.js
@@ -14,7 +14,7 @@ var nativeMax = Math.max;
* @since 1.1.0
* @category Array
* @param {Array} array The array to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=0] The index to search from.
* @returns {number} Returns the index of the found element, else `-1`.
diff --git a/findKey.js b/findKey.js
index 26fc234e2..becfb5aa2 100644
--- a/findKey.js
+++ b/findKey.js
@@ -11,8 +11,7 @@ var baseFindKey = require('./_baseFindKey'),
* @since 1.1.0
* @category Object
* @param {Object} object The object to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {string|undefined} Returns the key of the matched element,
* else `undefined`.
* @example
diff --git a/findLast.js b/findLast.js
index f8dd4e1d7..a1dce4039 100644
--- a/findLast.js
+++ b/findLast.js
@@ -10,7 +10,7 @@ var createFind = require('./_createFind'),
* @since 2.0.0
* @category Collection
* @param {Array|Object} collection The collection to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=collection.length-1] The index to search from.
* @returns {*} Returns the matched element, else `undefined`.
diff --git a/findLastIndex.js b/findLastIndex.js
index 2caf34aec..684be484f 100644
--- a/findLastIndex.js
+++ b/findLastIndex.js
@@ -15,7 +15,7 @@ var nativeMax = Math.max,
* @since 2.0.0
* @category Array
* @param {Array} array The array to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=array.length-1] The index to search from.
* @returns {number} Returns the index of the found element, else `-1`.
diff --git a/findLastKey.js b/findLastKey.js
index 5eedc1d29..9db2c5e73 100644
--- a/findLastKey.js
+++ b/findLastKey.js
@@ -11,8 +11,7 @@ var baseFindKey = require('./_baseFindKey'),
* @since 2.0.0
* @category Object
* @param {Object} object The object to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {string|undefined} Returns the key of the matched element,
* else `undefined`.
* @example
diff --git a/flatMap.js b/flatMap.js
index f8307495f..8c5d83281 100644
--- a/flatMap.js
+++ b/flatMap.js
@@ -11,7 +11,7 @@ var baseFlatten = require('./_baseFlatten'),
* @since 4.0.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new flattened array.
* @example
diff --git a/flatMapDeep.js b/flatMapDeep.js
index 3808262aa..9359882ff 100644
--- a/flatMapDeep.js
+++ b/flatMapDeep.js
@@ -13,7 +13,7 @@ var INFINITY = 1 / 0;
* @since 4.7.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new flattened array.
* @example
diff --git a/flatMapDepth.js b/flatMapDepth.js
index d528bff26..2182bed67 100644
--- a/flatMapDepth.js
+++ b/flatMapDepth.js
@@ -11,7 +11,7 @@ var baseFlatten = require('./_baseFlatten'),
* @since 4.7.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The function invoked per iteration.
* @param {number} [depth=1] The maximum recursion depth.
* @returns {Array} Returns the new flattened array.
diff --git a/flip.js b/flip.js
index 574c78088..02e3fc27e 100644
--- a/flip.js
+++ b/flip.js
@@ -1,6 +1,6 @@
-var createWrapper = require('./_createWrapper');
+var createWrap = require('./_createWrap');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var FLIP_FLAG = 512;
/**
@@ -22,7 +22,7 @@ var FLIP_FLAG = 512;
* // => ['d', 'c', 'b', 'a']
*/
function flip(func) {
- return createWrapper(func, FLIP_FLAG);
+ return createWrap(func, FLIP_FLAG);
}
module.exports = flip;
diff --git a/flow.js b/flow.js
index 462f2dbdc..74b6b62d4 100644
--- a/flow.js
+++ b/flow.js
@@ -9,7 +9,7 @@ var createFlow = require('./_createFlow');
* @memberOf _
* @since 3.0.0
* @category Util
- * @param {...(Function|Function[])} [funcs] Functions to invoke.
+ * @param {...(Function|Function[])} [funcs] The functions to invoke.
* @returns {Function} Returns the new composite function.
* @see _.flowRight
* @example
diff --git a/flowRight.js b/flowRight.js
index a4eb8b616..114614105 100644
--- a/flowRight.js
+++ b/flowRight.js
@@ -8,7 +8,7 @@ var createFlow = require('./_createFlow');
* @since 3.0.0
* @memberOf _
* @category Util
- * @param {...(Function|Function[])} [funcs] Functions to invoke.
+ * @param {...(Function|Function[])} [funcs] The functions to invoke.
* @returns {Function} Returns the new composite function.
* @see _.flow
* @example
diff --git a/fp/F.js b/fp/F.js
new file mode 100644
index 000000000..a05a63ad9
--- /dev/null
+++ b/fp/F.js
@@ -0,0 +1 @@
+module.exports = require('./stubFalse');
diff --git a/fp/T.js b/fp/T.js
new file mode 100644
index 000000000..e2ba8ea56
--- /dev/null
+++ b/fp/T.js
@@ -0,0 +1 @@
+module.exports = require('./stubTrue');
diff --git a/fp/_baseConvert.js b/fp/_baseConvert.js
index e177cdd03..d294820d8 100644
--- a/fp/_baseConvert.js
+++ b/fp/_baseConvert.js
@@ -71,11 +71,11 @@ function createCloner(func) {
* @param {Function} cloner The function to clone arguments.
* @returns {Function} Returns the new immutable function.
*/
-function immutWrap(func, cloner) {
+function wrapImmutable(func, cloner) {
return function() {
var length = arguments.length;
if (!length) {
- return result;
+ return;
}
var args = Array(length);
while (length--) {
@@ -209,6 +209,12 @@ function baseConvert(util, name, func, options) {
return func;
};
},
+ 'rearg': function(rearg) {
+ return function(func, indexes) {
+ var n = indexes ? indexes.length : 0;
+ return curry(rearg(func, indexes), n);
+ };
+ },
'runInContext': function(runInContext) {
return function(context) {
return baseConvert(util, runInContext(context), options);
@@ -218,6 +224,77 @@ function baseConvert(util, name, func, options) {
/*--------------------------------------------------------------------------*/
+ /**
+ * Casts `func` to a function with an arity capped iteratee if needed.
+ *
+ * @private
+ * @param {string} name The name of the function to inspect.
+ * @param {Function} func The function to inspect.
+ * @returns {Function} Returns the cast function.
+ */
+ function castCap(name, func) {
+ if (config.cap) {
+ var indexes = mapping.iterateeRearg[name];
+ if (indexes) {
+ return iterateeRearg(func, indexes);
+ }
+ var n = !isLib && mapping.iterateeAry[name];
+ if (n) {
+ return iterateeAry(func, n);
+ }
+ }
+ return func;
+ }
+
+ /**
+ * Casts `func` to a curried function if needed.
+ *
+ * @private
+ * @param {string} name The name of the function to inspect.
+ * @param {Function} func The function to inspect.
+ * @param {number} n The arity of `func`.
+ * @returns {Function} Returns the cast function.
+ */
+ function castCurry(name, func, n) {
+ return (forceCurry || (config.curry && n > 1))
+ ? curry(func, n)
+ : func;
+ }
+
+ /**
+ * Casts `func` to a fixed arity function if needed.
+ *
+ * @private
+ * @param {string} name The name of the function to inspect.
+ * @param {Function} func The function to inspect.
+ * @param {number} n The arity cap.
+ * @returns {Function} Returns the cast function.
+ */
+ function castFixed(name, func, n) {
+ if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
+ var data = mapping.methodSpread[name],
+ start = data && data.start;
+
+ return start === undefined ? ary(func, n) : spread(func, start);
+ }
+ return func;
+ }
+
+ /**
+ * Casts `func` to an rearged function if needed.
+ *
+ * @private
+ * @param {string} name The name of the function to inspect.
+ * @param {Function} func The function to inspect.
+ * @param {number} n The arity of `func`.
+ * @returns {Function} Returns the cast function.
+ */
+ function castRearg(name, func, n) {
+ return (config.rearg && n > 1 && (forceRearg || !mapping.skipRearg[name]))
+ ? rearg(func, mapping.methodRearg[name] || mapping.aryRearg[n])
+ : func;
+ }
+
/**
* Creates a clone of `object` by `path`.
*
@@ -310,12 +387,11 @@ function baseConvert(util, name, func, options) {
}
/**
- * Creates a function that invokes `func` with its first argument passed
- * thru `transform`.
+ * Creates a function that invokes `func` with its first argument transformed.
*
* @private
* @param {Function} func The function to wrap.
- * @param {...Function} transform The functions to transform the first argument.
+ * @param {Function} transform The argument transform.
* @returns {Function} Returns the new function.
*/
function overArg(func, transform) {
@@ -355,42 +431,27 @@ function baseConvert(util, name, func, options) {
}
else if (config.immutable) {
if (mutateMap.array[name]) {
- wrapped = immutWrap(func, cloneArray);
+ wrapped = wrapImmutable(func, cloneArray);
}
else if (mutateMap.object[name]) {
- wrapped = immutWrap(func, createCloner(func));
+ wrapped = wrapImmutable(func, createCloner(func));
}
else if (mutateMap.set[name]) {
- wrapped = immutWrap(func, cloneByPath);
+ wrapped = wrapImmutable(func, cloneByPath);
}
}
each(aryMethodKeys, function(aryKey) {
each(mapping.aryMethod[aryKey], function(otherName) {
if (name == otherName) {
- var aryN = !isLib && mapping.iterateeAry[name],
- reargIndexes = mapping.iterateeRearg[name],
- spreadStart = mapping.methodSpread[name];
+ var spreadData = mapping.methodSpread[name],
+ afterRearg = spreadData && spreadData.afterRearg;
- result = wrapped;
- if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
- result = spreadStart === undefined
- ? ary(result, aryKey)
- : spread(result, spreadStart);
- }
- if (config.rearg && aryKey > 1 && (forceRearg || !mapping.skipRearg[name])) {
- result = rearg(result, mapping.methodRearg[name] || mapping.aryRearg[aryKey]);
- }
- if (config.cap) {
- if (reargIndexes) {
- result = iterateeRearg(result, reargIndexes);
- } else if (aryN) {
- result = iterateeAry(result, aryN);
- }
- }
- if (forceCurry || (config.curry && aryKey > 1)) {
- forceCurry && console.log(forceCurry, name);
- result = curry(result, aryKey);
- }
+ result = afterRearg
+ ? castFixed(name, castRearg(name, wrapped, aryKey), aryKey)
+ : castRearg(name, castFixed(name, wrapped, aryKey), aryKey);
+
+ result = castCap(name, result);
+ result = castCurry(name, result, aryKey);
return false;
}
});
diff --git a/fp/_mapping.js b/fp/_mapping.js
index a30c5dee4..cb36eedad 100644
--- a/fp/_mapping.js
+++ b/fp/_mapping.js
@@ -7,11 +7,20 @@ exports.aliasToReal = {
'entries': 'toPairs',
'entriesIn': 'toPairsIn',
'extend': 'assignIn',
+ 'extendAll': 'assignInAll',
+ 'extendAllWith': 'assignInAllWith',
'extendWith': 'assignInWith',
'first': 'head',
+ // Methods that are curried variants of others.
+ 'conforms': 'conformsTo',
+ 'matches': 'isMatch',
+ 'property': 'get',
+
// Ramda aliases.
'__': 'placeholder',
+ 'F': 'stubFalse',
+ 'T': 'stubTrue',
'all': 'every',
'allPass': 'overEvery',
'always': 'constant',
@@ -25,8 +34,11 @@ exports.aliasToReal = {
'contains': 'includes',
'dissoc': 'unset',
'dissocPath': 'unset',
+ 'dropLast': 'dropRight',
+ 'dropLastWhile': 'dropRightWhile',
'equals': 'isEqual',
'identical': 'eq',
+ 'indexBy': 'keyBy',
'init': 'initial',
'invertObj': 'invert',
'juxt': 'over',
@@ -43,36 +55,44 @@ exports.aliasToReal = {
'propEq': 'matchesProperty',
'propOr': 'getOr',
'props': 'at',
+ 'symmetricDifference': 'xor',
+ 'symmetricDifferenceBy': 'xorBy',
+ 'symmetricDifferenceWith': 'xorWith',
+ 'takeLast': 'takeRight',
+ 'takeLastWhile': 'takeRightWhile',
'unapply': 'rest',
'unnest': 'flatten',
'useWith': 'overArgs',
- 'whereEq': 'filter',
+ 'where': 'conformsTo',
+ 'whereEq': 'isMatch',
'zipObj': 'zipObject'
};
/** Used to map ary to method names. */
exports.aryMethod = {
'1': [
- 'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
- 'flow', 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method',
- 'methodOf', 'mixin', 'over', 'overEvery', 'overSome', 'rest', 'reverse',
- 'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
- 'uniqueId', 'words'
+ 'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',
+ 'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',
+ 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method',
+ 'mergeAll', 'methodOf', 'mixin', 'over', 'overEvery', 'overSome', 'rest',
+ 'reverse', 'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd',
+ 'trimStart', 'uniqueId', 'words', 'zipAll'
],
'2': [
- 'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindAll',
- 'bindKey', 'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
- 'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
- 'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith',
- 'eq', 'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast',
- 'findLastIndex', 'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth',
- 'forEach', 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight',
- 'get', 'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf',
- 'intersection', 'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch',
- 'join', 'keyBy', 'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues',
- 'matchesProperty', 'maxBy', 'meanBy', 'merge', 'minBy', 'multiply', 'nth',
- 'omit', 'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt',
- 'partial', 'partialRight', 'partition', 'pick', 'pickBy', 'pull', 'pullAll',
+ 'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',
+ 'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',
+ 'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',
+ 'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',
+ 'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',
+ 'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
+ 'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',
+ 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',
+ 'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',
+ 'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',
+ 'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',
+ 'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',
+ 'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',
+ 'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
@@ -151,7 +171,9 @@ exports.iterateeRearg = {
/** Used to map method names to rearg configs. */
exports.methodRearg = {
+ 'assignInAllWith': [1, 2, 0],
'assignInWith': [1, 2, 0],
+ 'assignAllWith': [1, 2, 0],
'assignWith': [1, 2, 0],
'differenceBy': [1, 2, 0],
'differenceWith': [1, 2, 0],
@@ -160,6 +182,7 @@ exports.methodRearg = {
'intersectionWith': [1, 2, 0],
'isEqualWith': [1, 2, 0],
'isMatchWith': [2, 1, 0],
+ 'mergeAllWith': [1, 2, 0],
'mergeWith': [1, 2, 0],
'padChars': [2, 1, 0],
'padCharsEnd': [2, 1, 0],
@@ -179,11 +202,20 @@ exports.methodRearg = {
/** Used to map method names to spread configs. */
exports.methodSpread = {
- 'invokeArgs': 2,
- 'invokeArgsMap': 2,
- 'partial': 1,
- 'partialRight': 1,
- 'without': 1
+ 'assignAll': { 'start': 0 },
+ 'assignAllWith': { 'afterRearg': true, 'start': 1 },
+ 'assignInAll': { 'start': 0 },
+ 'assignInAllWith': { 'afterRearg': true, 'start': 1 },
+ 'defaultsAll': { 'start': 0 },
+ 'defaultsDeepAll': { 'start': 0 },
+ 'invokeArgs': { 'start': 2 },
+ 'invokeArgsMap': { 'start': 2 },
+ 'mergeAll': { 'start': 0 },
+ 'mergeAllWith': { 'afterRearg': true, 'start': 1 },
+ 'partial': { 'start': 1 },
+ 'partialRight': { 'start': 1 },
+ 'without': { 'start': 1 },
+ 'zipAll': { 'start': 0 }
};
/** Used to identify methods which mutate arrays or objects. */
@@ -200,13 +232,21 @@ exports.mutate = {
},
'object': {
'assign': true,
+ 'assignAll': true,
+ 'assignAllWith': true,
'assignIn': true,
+ 'assignInAll': true,
+ 'assignInAllWith': true,
'assignInWith': true,
'assignWith': true,
'defaults': true,
+ 'defaultsAll': true,
'defaultsDeep': true,
+ 'defaultsDeepAll': true,
'merge': true,
- 'mergeWith': true
+ 'mergeAll': true,
+ 'mergeAllWith': true,
+ 'mergeWith': true,
},
'set': {
'set': true,
@@ -246,8 +286,14 @@ exports.realToAlias = (function() {
/** Used to map method names to other names. */
exports.remap = {
+ 'assignAll': 'assign',
+ 'assignAllWith': 'assignWith',
+ 'assignInAll': 'assignIn',
+ 'assignInAllWith': 'assignInWith',
'curryN': 'curry',
'curryRightN': 'curryRight',
+ 'defaultsAll': 'defaults',
+ 'defaultsDeepAll': 'defaultsDeep',
'findFrom': 'find',
'findIndexFrom': 'findIndex',
'findLastFrom': 'findLast',
@@ -258,14 +304,18 @@ exports.remap = {
'invokeArgs': 'invoke',
'invokeArgsMap': 'invokeMap',
'lastIndexOfFrom': 'lastIndexOf',
+ 'mergeAll': 'merge',
+ 'mergeAllWith': 'mergeWith',
'padChars': 'pad',
'padCharsEnd': 'padEnd',
'padCharsStart': 'padStart',
+ 'propertyOf': 'get',
'restFrom': 'rest',
'spreadFrom': 'spread',
'trimChars': 'trim',
'trimCharsEnd': 'trimEnd',
- 'trimCharsStart': 'trimStart'
+ 'trimCharsStart': 'trimStart',
+ 'zipAll': 'zip'
};
/** Used to track methods that skip fixing their arity. */
@@ -275,6 +325,7 @@ exports.skipFixed = {
'flowRight': true,
'iteratee': true,
'mixin': true,
+ 'rearg': true,
'runInContext': true
};
@@ -300,10 +351,12 @@ exports.skipRearg = {
'overArgs': true,
'partial': true,
'partialRight': true,
+ 'propertyOf': true,
'random': true,
'range': true,
'rangeRight': true,
'subtract': true,
'zip': true,
- 'zipObject': true
+ 'zipObject': true,
+ 'zipObjectDeep': true
};
diff --git a/fp/assignAll.js b/fp/assignAll.js
new file mode 100644
index 000000000..b1d36c7ef
--- /dev/null
+++ b/fp/assignAll.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('assignAll', require('../assign'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/assignAllWith.js b/fp/assignAllWith.js
new file mode 100644
index 000000000..21e836e6f
--- /dev/null
+++ b/fp/assignAllWith.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('assignAllWith', require('../assignWith'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/assignInAll.js b/fp/assignInAll.js
new file mode 100644
index 000000000..7ba75dba1
--- /dev/null
+++ b/fp/assignInAll.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('assignInAll', require('../assignIn'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/assignInAllWith.js b/fp/assignInAllWith.js
new file mode 100644
index 000000000..e766903d4
--- /dev/null
+++ b/fp/assignInAllWith.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('assignInAllWith', require('../assignInWith'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/conforms.js b/fp/conforms.js
index e193cd6c1..3247f64a8 100644
--- a/fp/conforms.js
+++ b/fp/conforms.js
@@ -1,5 +1 @@
-var convert = require('./convert'),
- func = convert('conforms', require('../conforms'), require('./_falseOptions'));
-
-func.placeholder = require('./placeholder');
-module.exports = func;
+module.exports = require('./conformsTo');
diff --git a/fp/conformsTo.js b/fp/conformsTo.js
new file mode 100644
index 000000000..aa7f41ec0
--- /dev/null
+++ b/fp/conformsTo.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('conformsTo', require('../conformsTo'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/defaultTo.js b/fp/defaultTo.js
new file mode 100644
index 000000000..d6b52a444
--- /dev/null
+++ b/fp/defaultTo.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('defaultTo', require('../defaultTo'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/defaultsAll.js b/fp/defaultsAll.js
new file mode 100644
index 000000000..238fcc3c2
--- /dev/null
+++ b/fp/defaultsAll.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('defaultsAll', require('../defaults'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/defaultsDeepAll.js b/fp/defaultsDeepAll.js
new file mode 100644
index 000000000..6835f2f07
--- /dev/null
+++ b/fp/defaultsDeepAll.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('defaultsDeepAll', require('../defaultsDeep'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/dropLast.js b/fp/dropLast.js
new file mode 100644
index 000000000..174e52551
--- /dev/null
+++ b/fp/dropLast.js
@@ -0,0 +1 @@
+module.exports = require('./dropRight');
diff --git a/fp/dropLastWhile.js b/fp/dropLastWhile.js
new file mode 100644
index 000000000..be2a9d24a
--- /dev/null
+++ b/fp/dropLastWhile.js
@@ -0,0 +1 @@
+module.exports = require('./dropRightWhile');
diff --git a/fp/extendAll.js b/fp/extendAll.js
new file mode 100644
index 000000000..cc55b64fc
--- /dev/null
+++ b/fp/extendAll.js
@@ -0,0 +1 @@
+module.exports = require('./assignInAll');
diff --git a/fp/extendAllWith.js b/fp/extendAllWith.js
new file mode 100644
index 000000000..6679d208b
--- /dev/null
+++ b/fp/extendAllWith.js
@@ -0,0 +1 @@
+module.exports = require('./assignInAllWith');
diff --git a/fp/indexBy.js b/fp/indexBy.js
new file mode 100644
index 000000000..7e64bc0fc
--- /dev/null
+++ b/fp/indexBy.js
@@ -0,0 +1 @@
+module.exports = require('./keyBy');
diff --git a/fp/matches.js b/fp/matches.js
index 629399cb8..29d1e1e4f 100644
--- a/fp/matches.js
+++ b/fp/matches.js
@@ -1,5 +1 @@
-var convert = require('./convert'),
- func = convert('matches', require('../matches'), require('./_falseOptions'));
-
-func.placeholder = require('./placeholder');
-module.exports = func;
+module.exports = require('./isMatch');
diff --git a/fp/mergeAll.js b/fp/mergeAll.js
new file mode 100644
index 000000000..a3674d671
--- /dev/null
+++ b/fp/mergeAll.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('mergeAll', require('../merge'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/mergeAllWith.js b/fp/mergeAllWith.js
new file mode 100644
index 000000000..4bd4206dc
--- /dev/null
+++ b/fp/mergeAllWith.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('mergeAllWith', require('../mergeWith'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fp/property.js b/fp/property.js
index d832fbba3..b29cfb213 100644
--- a/fp/property.js
+++ b/fp/property.js
@@ -1,5 +1 @@
-var convert = require('./convert'),
- func = convert('property', require('../property'), require('./_falseOptions'));
-
-func.placeholder = require('./placeholder');
-module.exports = func;
+module.exports = require('./get');
diff --git a/fp/propertyOf.js b/fp/propertyOf.js
index 3cfdef790..f6273ee47 100644
--- a/fp/propertyOf.js
+++ b/fp/propertyOf.js
@@ -1,5 +1,5 @@
var convert = require('./convert'),
- func = convert('propertyOf', require('../propertyOf'), require('./_falseOptions'));
+ func = convert('propertyOf', require('../get'));
func.placeholder = require('./placeholder');
module.exports = func;
diff --git a/fp/symmetricDifference.js b/fp/symmetricDifference.js
new file mode 100644
index 000000000..78c16add6
--- /dev/null
+++ b/fp/symmetricDifference.js
@@ -0,0 +1 @@
+module.exports = require('./xor');
diff --git a/fp/symmetricDifferenceBy.js b/fp/symmetricDifferenceBy.js
new file mode 100644
index 000000000..298fc7ff6
--- /dev/null
+++ b/fp/symmetricDifferenceBy.js
@@ -0,0 +1 @@
+module.exports = require('./xorBy');
diff --git a/fp/symmetricDifferenceWith.js b/fp/symmetricDifferenceWith.js
new file mode 100644
index 000000000..70bc6faf2
--- /dev/null
+++ b/fp/symmetricDifferenceWith.js
@@ -0,0 +1 @@
+module.exports = require('./xorWith');
diff --git a/fp/takeLast.js b/fp/takeLast.js
new file mode 100644
index 000000000..e98c84a16
--- /dev/null
+++ b/fp/takeLast.js
@@ -0,0 +1 @@
+module.exports = require('./takeRight');
diff --git a/fp/takeLastWhile.js b/fp/takeLastWhile.js
new file mode 100644
index 000000000..5367968a3
--- /dev/null
+++ b/fp/takeLastWhile.js
@@ -0,0 +1 @@
+module.exports = require('./takeRightWhile');
diff --git a/fp/where.js b/fp/where.js
new file mode 100644
index 000000000..3247f64a8
--- /dev/null
+++ b/fp/where.js
@@ -0,0 +1 @@
+module.exports = require('./conformsTo');
diff --git a/fp/whereEq.js b/fp/whereEq.js
index ade80f6fb..29d1e1e4f 100644
--- a/fp/whereEq.js
+++ b/fp/whereEq.js
@@ -1 +1 @@
-module.exports = require('./filter');
+module.exports = require('./isMatch');
diff --git a/fp/zipAll.js b/fp/zipAll.js
new file mode 100644
index 000000000..efa8ccbfb
--- /dev/null
+++ b/fp/zipAll.js
@@ -0,0 +1,5 @@
+var convert = require('./convert'),
+ func = convert('zipAll', require('../zip'));
+
+func.placeholder = require('./placeholder');
+module.exports = func;
diff --git a/fromPairs.js b/fromPairs.js
index a591488ef..39f5fb342 100644
--- a/fromPairs.js
+++ b/fromPairs.js
@@ -10,8 +10,8 @@
* @returns {Object} Returns the new object.
* @example
*
- * _.fromPairs([['fred', 30], ['barney', 40]]);
- * // => { 'fred': 30, 'barney': 40 }
+ * _.fromPairs([['a', 1], ['b', 2]]);
+ * // => { 'a': 1, 'b': 2 }
*/
function fromPairs(pairs) {
var index = -1,
diff --git a/get.js b/get.js
index 5a5837b25..8805ff92c 100644
--- a/get.js
+++ b/get.js
@@ -2,7 +2,7 @@ var baseGet = require('./_baseGet');
/**
* Gets the value at `path` of `object`. If the resolved value is
- * `undefined`, the `defaultValue` is used in its place.
+ * `undefined`, the `defaultValue` is returned in its place.
*
* @static
* @memberOf _
diff --git a/groupBy.js b/groupBy.js
index ae7db5faa..3a7dbaf43 100644
--- a/groupBy.js
+++ b/groupBy.js
@@ -18,7 +18,7 @@ var hasOwnProperty = objectProto.hasOwnProperty;
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee to transform keys.
* @returns {Object} Returns the composed aggregate object.
* @example
diff --git a/identity.js b/identity.js
index 058296ffc..2d5d963cd 100644
--- a/identity.js
+++ b/identity.js
@@ -1,5 +1,5 @@
/**
- * This method returns the first argument given to it.
+ * This method returns the first argument it receives.
*
* @static
* @since 0.1.0
@@ -9,7 +9,7 @@
* @returns {*} Returns `value`.
* @example
*
- * var object = { 'user': 'fred' };
+ * var object = { 'a': 1 };
*
* console.log(_.identity(object) === object);
* // => true
diff --git a/includes.js b/includes.js
index cefe3bf94..8c3c51376 100644
--- a/includes.js
+++ b/includes.js
@@ -31,10 +31,10 @@ var nativeMax = Math.max;
* _.includes([1, 2, 3], 1, 2);
* // => false
*
- * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');
+ * _.includes({ 'a': 1, 'b': 2 }, 1);
* // => true
*
- * _.includes('pebbles', 'eb');
+ * _.includes('abcd', 'bc');
* // => true
*/
function includes(collection, value, fromIndex, guard) {
diff --git a/intersection.js b/intersection.js
index 1da06f8f5..20c0a4084 100644
--- a/intersection.js
+++ b/intersection.js
@@ -1,7 +1,7 @@
var arrayMap = require('./_arrayMap'),
baseIntersection = require('./_baseIntersection'),
- castArrayLikeObject = require('./_castArrayLikeObject'),
- rest = require('./rest');
+ baseRest = require('./_baseRest'),
+ castArrayLikeObject = require('./_castArrayLikeObject');
/**
* Creates an array of unique values that are included in all given arrays
@@ -20,7 +20,7 @@ var arrayMap = require('./_arrayMap'),
* _.intersection([2, 1], [2, 3]);
* // => [2]
*/
-var intersection = rest(function(arrays) {
+var intersection = baseRest(function(arrays) {
var mapped = arrayMap(arrays, castArrayLikeObject);
return (mapped.length && mapped[0] === arrays[0])
? baseIntersection(mapped)
diff --git a/intersectionBy.js b/intersectionBy.js
index 5b8ffdcc2..436c28646 100644
--- a/intersectionBy.js
+++ b/intersectionBy.js
@@ -1,9 +1,9 @@
var arrayMap = require('./_arrayMap'),
baseIntersection = require('./_baseIntersection'),
baseIteratee = require('./_baseIteratee'),
+ baseRest = require('./_baseRest'),
castArrayLikeObject = require('./_castArrayLikeObject'),
- last = require('./last'),
- rest = require('./rest');
+ last = require('./last');
/**
* This method is like `_.intersection` except that it accepts `iteratee`
@@ -16,8 +16,7 @@ var arrayMap = require('./_arrayMap'),
* @since 4.0.0
* @category Array
* @param {...Array} [arrays] The arrays to inspect.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {Array} Returns the new array of intersecting values.
* @example
*
@@ -28,7 +27,7 @@ var arrayMap = require('./_arrayMap'),
* _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
* // => [{ 'x': 1 }]
*/
-var intersectionBy = rest(function(arrays) {
+var intersectionBy = baseRest(function(arrays) {
var iteratee = last(arrays),
mapped = arrayMap(arrays, castArrayLikeObject);
@@ -38,7 +37,7 @@ var intersectionBy = rest(function(arrays) {
mapped.pop();
}
return (mapped.length && mapped[0] === arrays[0])
- ? baseIntersection(mapped, baseIteratee(iteratee))
+ ? baseIntersection(mapped, baseIteratee(iteratee, 2))
: [];
});
diff --git a/intersectionWith.js b/intersectionWith.js
index bc195dc99..736eca26a 100644
--- a/intersectionWith.js
+++ b/intersectionWith.js
@@ -1,8 +1,8 @@
var arrayMap = require('./_arrayMap'),
baseIntersection = require('./_baseIntersection'),
+ baseRest = require('./_baseRest'),
castArrayLikeObject = require('./_castArrayLikeObject'),
- last = require('./last'),
- rest = require('./rest');
+ last = require('./last');
/**
* This method is like `_.intersection` except that it accepts `comparator`
@@ -25,7 +25,7 @@ var arrayMap = require('./_arrayMap'),
* _.intersectionWith(objects, others, _.isEqual);
* // => [{ 'x': 1, 'y': 2 }]
*/
-var intersectionWith = rest(function(arrays) {
+var intersectionWith = baseRest(function(arrays) {
var comparator = last(arrays),
mapped = arrayMap(arrays, castArrayLikeObject);
diff --git a/invertBy.js b/invertBy.js
index 4298199cc..e5ba0f709 100644
--- a/invertBy.js
+++ b/invertBy.js
@@ -19,8 +19,7 @@ var hasOwnProperty = objectProto.hasOwnProperty;
* @since 4.1.0
* @category Object
* @param {Object} object The object to invert.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {Object} Returns the new inverted object.
* @example
*
diff --git a/invoke.js b/invoke.js
index 7b6f56bb1..97d51eb5b 100644
--- a/invoke.js
+++ b/invoke.js
@@ -1,5 +1,5 @@
var baseInvoke = require('./_baseInvoke'),
- rest = require('./rest');
+ baseRest = require('./_baseRest');
/**
* Invokes the method at `path` of `object`.
@@ -19,6 +19,6 @@ var baseInvoke = require('./_baseInvoke'),
* _.invoke(object, 'a[0].b.c.slice', 1, 3);
* // => [2, 3]
*/
-var invoke = rest(baseInvoke);
+var invoke = baseRest(baseInvoke);
module.exports = invoke;
diff --git a/invokeMap.js b/invokeMap.js
index 4a6063e0a..f3302db86 100644
--- a/invokeMap.js
+++ b/invokeMap.js
@@ -1,15 +1,15 @@
var apply = require('./_apply'),
baseEach = require('./_baseEach'),
baseInvoke = require('./_baseInvoke'),
+ baseRest = require('./_baseRest'),
isArrayLike = require('./isArrayLike'),
- isKey = require('./_isKey'),
- rest = require('./rest');
+ isKey = require('./_isKey');
/**
* Invokes the method at `path` of each element in `collection`, returning
* an array of the results of each invoked method. Any additional arguments
- * are provided to each invoked method. If `methodName` is a function, it's
- * invoked for and `this` bound to, each element in `collection`.
+ * are provided to each invoked method. If `path` is a function, it's invoked
+ * for, and `this` bound to, each element in `collection`.
*
* @static
* @memberOf _
@@ -28,7 +28,7 @@ var apply = require('./_apply'),
* _.invokeMap([123, 456], String.prototype.split, '');
* // => [['1', '2', '3'], ['4', '5', '6']]
*/
-var invokeMap = rest(function(collection, path, args) {
+var invokeMap = baseRest(function(collection, path, args) {
var index = -1,
isFunc = typeof path == 'function',
isProp = isKey(path),
diff --git a/isArguments.js b/isArguments.js
index 3ca0d3ca1..a96e244ba 100644
--- a/isArguments.js
+++ b/isArguments.js
@@ -27,7 +27,7 @@ var propertyIsEnumerable = objectProto.propertyIsEnumerable;
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
* else `false`.
* @example
*
diff --git a/isArray.js b/isArray.js
index 1901120e7..88ab55fd0 100644
--- a/isArray.js
+++ b/isArray.js
@@ -4,11 +4,9 @@
* @static
* @memberOf _
* @since 0.1.0
- * @type {Function}
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
diff --git a/isArrayBuffer.js b/isArrayBuffer.js
index 0a6a8e676..12904a64b 100644
--- a/isArrayBuffer.js
+++ b/isArrayBuffer.js
@@ -1,16 +1,9 @@
-var isObjectLike = require('./isObjectLike');
+var baseIsArrayBuffer = require('./_baseIsArrayBuffer'),
+ baseUnary = require('./_baseUnary'),
+ nodeUtil = require('./_nodeUtil');
-var arrayBufferTag = '[object ArrayBuffer]';
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
+/* Node.js helper references. */
+var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer;
/**
* Checks if `value` is classified as an `ArrayBuffer` object.
@@ -20,8 +13,7 @@ var objectToString = objectProto.toString;
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
* @example
*
* _.isArrayBuffer(new ArrayBuffer(2));
@@ -30,8 +22,6 @@ var objectToString = objectProto.toString;
* _.isArrayBuffer(new Array(2));
* // => false
*/
-function isArrayBuffer(value) {
- return isObjectLike(value) && objectToString.call(value) == arrayBufferTag;
-}
+var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
module.exports = isArrayBuffer;
diff --git a/isBoolean.js b/isBoolean.js
index 242fad1ff..b9083211c 100644
--- a/isBoolean.js
+++ b/isBoolean.js
@@ -21,8 +21,7 @@ var objectToString = objectProto.toString;
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
* @example
*
* _.isBoolean(false);
diff --git a/isBuffer.js b/isBuffer.js
index 566c09f77..c08e3616c 100644
--- a/isBuffer.js
+++ b/isBuffer.js
@@ -1,8 +1,9 @@
-var root = require('./_root'),
+var freeGlobal = require('./_freeGlobal'),
+ root = require('./_root'),
stubFalse = require('./stubFalse');
/** Detect free variable `exports`. */
-var freeExports = typeof exports == 'object' && exports;
+var freeExports = freeGlobal && typeof exports == 'object' && exports;
/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module;
@@ -13,6 +14,9 @@ var moduleExports = freeModule && freeModule.exports === freeExports;
/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined;
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
+
/**
* Checks if `value` is a buffer.
*
@@ -30,8 +34,6 @@ var Buffer = moduleExports ? root.Buffer : undefined;
* _.isBuffer(new Uint8Array(2));
* // => false
*/
-var isBuffer = !Buffer ? stubFalse : function(value) {
- return value instanceof Buffer;
-};
+var isBuffer = nativeIsBuffer || stubFalse;
module.exports = isBuffer;
diff --git a/isDate.js b/isDate.js
index f85a80174..7f0209fca 100644
--- a/isDate.js
+++ b/isDate.js
@@ -1,17 +1,9 @@
-var isObjectLike = require('./isObjectLike');
+var baseIsDate = require('./_baseIsDate'),
+ baseUnary = require('./_baseUnary'),
+ nodeUtil = require('./_nodeUtil');
-/** `Object#toString` result references. */
-var dateTag = '[object Date]';
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
+/* Node.js helper references. */
+var nodeIsDate = nodeUtil && nodeUtil.isDate;
/**
* Checks if `value` is classified as a `Date` object.
@@ -21,8 +13,7 @@ var objectToString = objectProto.toString;
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
* @example
*
* _.isDate(new Date);
@@ -31,8 +22,6 @@ var objectToString = objectProto.toString;
* _.isDate('Mon April 23 2012');
* // => false
*/
-function isDate(value) {
- return isObjectLike(value) && objectToString.call(value) == dateTag;
-}
+var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
module.exports = isDate;
diff --git a/isEqual.js b/isEqual.js
index dd5d0cc7c..bd694dcf2 100644
--- a/isEqual.js
+++ b/isEqual.js
@@ -20,8 +20,8 @@ var baseIsEqual = require('./_baseIsEqual');
* else `false`.
* @example
*
- * var object = { 'user': 'fred' };
- * var other = { 'user': 'fred' };
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
*
* _.isEqual(object, other);
* // => true
diff --git a/isFunction.js b/isFunction.js
index da02be0e1..115f4667f 100644
--- a/isFunction.js
+++ b/isFunction.js
@@ -22,8 +22,7 @@ var objectToString = objectProto.toString;
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
diff --git a/isMap.js b/isMap.js
index f83758e13..44f8517ee 100644
--- a/isMap.js
+++ b/isMap.js
@@ -1,8 +1,9 @@
-var getTag = require('./_getTag'),
- isObjectLike = require('./isObjectLike');
+var baseIsMap = require('./_baseIsMap'),
+ baseUnary = require('./_baseUnary'),
+ nodeUtil = require('./_nodeUtil');
-/** `Object#toString` result references. */
-var mapTag = '[object Map]';
+/* Node.js helper references. */
+var nodeIsMap = nodeUtil && nodeUtil.isMap;
/**
* Checks if `value` is classified as a `Map` object.
@@ -12,8 +13,7 @@ var mapTag = '[object Map]';
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
* @example
*
* _.isMap(new Map);
@@ -22,8 +22,6 @@ var mapTag = '[object Map]';
* _.isMap(new WeakMap);
* // => false
*/
-function isMap(value) {
- return isObjectLike(value) && getTag(value) == mapTag;
-}
+var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
module.exports = isMap;
diff --git a/isMatch.js b/isMatch.js
index 371e4458b..48fbe3f88 100644
--- a/isMatch.js
+++ b/isMatch.js
@@ -17,12 +17,12 @@ var baseIsMatch = require('./_baseIsMatch'),
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
* @example
*
- * var object = { 'user': 'fred', 'age': 40 };
+ * var object = { 'a': 1, 'b': 2 };
*
- * _.isMatch(object, { 'age': 40 });
+ * _.isMatch(object, { 'b': 2 });
* // => true
*
- * _.isMatch(object, { 'age': 36 });
+ * _.isMatch(object, { 'b': 1 });
* // => false
*/
function isMatch(object, source) {
diff --git a/isNative.js b/isNative.js
index 8d9dd0588..4bd57d8d1 100644
--- a/isNative.js
+++ b/isNative.js
@@ -4,13 +4,13 @@ var baseIsNative = require('./_baseIsNative'),
/**
* Checks if `value` is a pristine native function.
*
- * **Note:** This method can't reliably detect native functions in the
- * presence of the `core-js` package because `core-js` circumvents this kind
- * of detection. Despite multiple requests, the `core-js` maintainer has made
- * it clear: any attempt to fix the detection will be obstructed. As a result,
- * we're left with little choice but to throw an error. Unfortunately, this
- * also affects packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
- * which rely on `core-js`.
+ * **Note:** This method can't reliably detect native functions in the presence
+ * of the core-js package because core-js circumvents this kind of detection.
+ * Despite multiple requests, the core-js maintainer has made it clear: any
+ * attempt to fix the detection will be obstructed. As a result, we're left
+ * with little choice but to throw an error. Unfortunately, this also affects
+ * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
+ * which rely on core-js.
*
* @static
* @memberOf _
@@ -29,7 +29,7 @@ var baseIsNative = require('./_baseIsNative'),
*/
function isNative(value) {
if (isMaskable(value)) {
- throw new Error('This method is not supported with `core-js`. Try https://github.com/es-shims.');
+ throw new Error('This method is not supported with core-js. Try https://github.com/es-shims.');
}
return baseIsNative(value);
}
diff --git a/isNumber.js b/isNumber.js
index e427282ac..aa6148836 100644
--- a/isNumber.js
+++ b/isNumber.js
@@ -24,8 +24,7 @@ var objectToString = objectProto.toString;
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a number, else `false`.
* @example
*
* _.isNumber(3);
diff --git a/isRegExp.js b/isRegExp.js
index 8eeb4103e..76c9b6e9c 100644
--- a/isRegExp.js
+++ b/isRegExp.js
@@ -1,17 +1,9 @@
-var isObject = require('./isObject');
+var baseIsRegExp = require('./_baseIsRegExp'),
+ baseUnary = require('./_baseUnary'),
+ nodeUtil = require('./_nodeUtil');
-/** `Object#toString` result references. */
-var regexpTag = '[object RegExp]';
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
+/* Node.js helper references. */
+var nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;
/**
* Checks if `value` is classified as a `RegExp` object.
@@ -21,8 +13,7 @@ var objectToString = objectProto.toString;
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
* @example
*
* _.isRegExp(/abc/);
@@ -31,8 +22,6 @@ var objectToString = objectProto.toString;
* _.isRegExp('/abc/');
* // => false
*/
-function isRegExp(value) {
- return isObject(value) && objectToString.call(value) == regexpTag;
-}
+var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
module.exports = isRegExp;
diff --git a/isSet.js b/isSet.js
index 9030dc44e..ab88bdf81 100644
--- a/isSet.js
+++ b/isSet.js
@@ -1,8 +1,9 @@
-var getTag = require('./_getTag'),
- isObjectLike = require('./isObjectLike');
+var baseIsSet = require('./_baseIsSet'),
+ baseUnary = require('./_baseUnary'),
+ nodeUtil = require('./_nodeUtil');
-/** `Object#toString` result references. */
-var setTag = '[object Set]';
+/* Node.js helper references. */
+var nodeIsSet = nodeUtil && nodeUtil.isSet;
/**
* Checks if `value` is classified as a `Set` object.
@@ -12,8 +13,7 @@ var setTag = '[object Set]';
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
* @example
*
* _.isSet(new Set);
@@ -22,8 +22,6 @@ var setTag = '[object Set]';
* _.isSet(new WeakSet);
* // => false
*/
-function isSet(value) {
- return isObjectLike(value) && getTag(value) == setTag;
-}
+var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
module.exports = isSet;
diff --git a/isString.js b/isString.js
index 573de3b53..b9d4f24fe 100644
--- a/isString.js
+++ b/isString.js
@@ -22,8 +22,7 @@ var objectToString = objectProto.toString;
* @memberOf _
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a string, else `false`.
* @example
*
* _.isString('abc');
diff --git a/isSymbol.js b/isSymbol.js
index 21dd55927..060d97f17 100644
--- a/isSymbol.js
+++ b/isSymbol.js
@@ -21,8 +21,7 @@ var objectToString = objectProto.toString;
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
diff --git a/isTypedArray.js b/isTypedArray.js
index 0d86b90cb..da3f8dd19 100644
--- a/isTypedArray.js
+++ b/isTypedArray.js
@@ -1,58 +1,9 @@
-var isLength = require('./isLength'),
- isObjectLike = require('./isObjectLike');
+var baseIsTypedArray = require('./_baseIsTypedArray'),
+ baseUnary = require('./_baseUnary'),
+ nodeUtil = require('./_nodeUtil');
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
- arrayTag = '[object Array]',
- boolTag = '[object Boolean]',
- dateTag = '[object Date]',
- errorTag = '[object Error]',
- funcTag = '[object Function]',
- mapTag = '[object Map]',
- numberTag = '[object Number]',
- objectTag = '[object Object]',
- regexpTag = '[object RegExp]',
- setTag = '[object Set]',
- stringTag = '[object String]',
- weakMapTag = '[object WeakMap]';
-
-var arrayBufferTag = '[object ArrayBuffer]',
- dataViewTag = '[object DataView]',
- float32Tag = '[object Float32Array]',
- float64Tag = '[object Float64Array]',
- int8Tag = '[object Int8Array]',
- int16Tag = '[object Int16Array]',
- int32Tag = '[object Int32Array]',
- uint8Tag = '[object Uint8Array]',
- uint8ClampedTag = '[object Uint8ClampedArray]',
- uint16Tag = '[object Uint16Array]',
- uint32Tag = '[object Uint32Array]';
-
-/** Used to identify `toStringTag` values of typed arrays. */
-var typedArrayTags = {};
-typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
-typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
-typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
-typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
-typedArrayTags[uint32Tag] = true;
-typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
-typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
-typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
-typedArrayTags[errorTag] = typedArrayTags[funcTag] =
-typedArrayTags[mapTag] = typedArrayTags[numberTag] =
-typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
-typedArrayTags[setTag] = typedArrayTags[stringTag] =
-typedArrayTags[weakMapTag] = false;
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
+/* Node.js helper references. */
+var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
/**
* Checks if `value` is classified as a typed array.
@@ -62,8 +13,7 @@ var objectToString = objectProto.toString;
* @since 3.0.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
* @example
*
* _.isTypedArray(new Uint8Array);
@@ -72,9 +22,6 @@ var objectToString = objectProto.toString;
* _.isTypedArray([]);
* // => false
*/
-function isTypedArray(value) {
- return isObjectLike(value) &&
- isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
-}
+var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
module.exports = isTypedArray;
diff --git a/isWeakMap.js b/isWeakMap.js
index cd7b9ed81..8d36f6638 100644
--- a/isWeakMap.js
+++ b/isWeakMap.js
@@ -12,8 +12,7 @@ var weakMapTag = '[object WeakMap]';
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
* @example
*
* _.isWeakMap(new WeakMap);
diff --git a/isWeakSet.js b/isWeakSet.js
index 5395797ae..a018f53c0 100644
--- a/isWeakSet.js
+++ b/isWeakSet.js
@@ -21,8 +21,7 @@ var objectToString = objectProto.toString;
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
* @example
*
* _.isWeakSet(new WeakSet);
diff --git a/keyBy.js b/keyBy.js
index 97e6f4b38..44393bf57 100644
--- a/keyBy.js
+++ b/keyBy.js
@@ -11,7 +11,7 @@ var createAggregator = require('./_createAggregator');
* @since 4.0.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee to transform keys.
* @returns {Object} Returns the composed aggregate object.
* @example
diff --git a/lang.js b/lang.js
index 6340c4b82..a3962169a 100644
--- a/lang.js
+++ b/lang.js
@@ -4,6 +4,7 @@ module.exports = {
'cloneDeep': require('./cloneDeep'),
'cloneDeepWith': require('./cloneDeepWith'),
'cloneWith': require('./cloneWith'),
+ 'conformsTo': require('./conformsTo'),
'eq': require('./eq'),
'gt': require('./gt'),
'gte': require('./gte'),
diff --git a/lastIndexOf.js b/lastIndexOf.js
index 1b8fbbc0e..f86516d51 100644
--- a/lastIndexOf.js
+++ b/lastIndexOf.js
@@ -1,4 +1,5 @@
-var indexOfNaN = require('./_indexOfNaN'),
+var baseFindIndex = require('./_baseFindIndex'),
+ baseIsNaN = require('./_baseIsNaN'),
toInteger = require('./toInteger');
/* Built-in method references for those with the same name as other `lodash` methods. */
@@ -41,7 +42,7 @@ function lastIndexOf(array, value, fromIndex) {
) + 1;
}
if (value !== value) {
- return indexOfNaN(array, index - 1, true);
+ return baseFindIndex(array, baseIsNaN, index - 1, true);
}
while (index--) {
if (array[index] === value) {
diff --git a/lodash.js b/lodash.js
index 5b5c703ba..8dd467299 100644
--- a/lodash.js
+++ b/lodash.js
@@ -12,7 +12,7 @@
var undefined;
/** Used as the semantic version number. */
- var VERSION = '4.13.1';
+ var VERSION = '4.14.0';
/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;
@@ -26,7 +26,7 @@
/** Used as the internal argument placeholder. */
var PLACEHOLDER = '__lodash_placeholder__';
- /** Used to compose bitmasks for wrapper metadata. */
+ /** Used to compose bitmasks for function metadata. */
var BIND_FLAG = 1,
BIND_KEY_FLAG = 2,
CURRY_BOUND_FLAG = 4,
@@ -66,6 +66,19 @@
MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
+ /** Used to associate wrap methods with their bit flags. */
+ var wrapFlags = [
+ ['ary', ARY_FLAG],
+ ['bind', BIND_FLAG],
+ ['bindKey', BIND_KEY_FLAG],
+ ['curry', CURRY_FLAG],
+ ['curryRight', CURRY_RIGHT_FLAG],
+ ['flip', FLIP_FLAG],
+ ['partial', PARTIAL_FLAG],
+ ['partialRight', PARTIAL_RIGHT_FLAG],
+ ['rearg', REARG_FLAG]
+ ];
+
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
@@ -130,6 +143,11 @@
reTrimStart = /^\s+/,
reTrimEnd = /\s+$/;
+ /** Used to match wrap detail comments. */
+ var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
+ reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
+ reSplitDetails = /,? & /;
+
/** Used to match non-compound words composed of alphanumeric characters. */
var reBasicWord = /[a-zA-Z0-9]+/g;
@@ -249,7 +267,7 @@
'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
'Promise', 'Reflect', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError',
'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
- '_', 'isFinite', 'parseInt', 'setTimeout'
+ '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
];
/** Used to make template sourceURLs easier to identify. */
@@ -342,8 +360,17 @@
var freeParseFloat = parseFloat,
freeParseInt = parseInt;
+ /** Detect free variable `global` from Node.js. */
+ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+ /** Detect free variable `self`. */
+ var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+ /** Used as a reference to the global object. */
+ var root = freeGlobal || freeSelf || Function('return this')();
+
/** Detect free variable `exports`. */
- var freeExports = typeof exports == 'object' && exports;
+ var freeExports = freeGlobal && typeof exports == 'object' && exports;
/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module;
@@ -351,17 +378,23 @@
/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = checkGlobal(typeof global == 'object' && global);
+ /** Detect free variable `process` from Node.js. */
+ var freeProcess = moduleExports && freeGlobal.process;
- /** Detect free variable `self`. */
- var freeSelf = checkGlobal(typeof self == 'object' && self);
+ /** Used to access faster Node.js helpers. */
+ var nodeUtil = (function() {
+ try {
+ return freeProcess && freeProcess.binding('util');
+ } catch (e) {}
+ }());
- /** Detect `this` as the global object. */
- var thisGlobal = checkGlobal(typeof this == 'object' && this);
-
- /** Used as a reference to the global object. */
- var root = freeGlobal || freeSelf || thisGlobal || Function('return this')();
+ /* Node.js helper references. */
+ var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
+ nodeIsDate = nodeUtil && nodeUtil.isDate,
+ nodeIsMap = nodeUtil && nodeUtil.isMap,
+ nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
+ nodeIsSet = nodeUtil && nodeUtil.isSet,
+ nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
/*--------------------------------------------------------------------------*/
@@ -374,7 +407,7 @@
* @returns {Object} Returns `map`.
*/
function addMapEntry(map, pair) {
- // Don't return `Map#set` because it doesn't return the map instance in IE 11.
+ // Don't return `map.set` because it's not chainable in IE 11.
map.set(pair[0], pair[1]);
return map;
}
@@ -388,6 +421,7 @@
* @returns {Object} Returns `set`.
*/
function addSetEntry(set, value) {
+ // Don't return `set.add` because it's not chainable in IE 11.
set.add(value);
return set;
}
@@ -403,8 +437,7 @@
* @returns {*} Returns the result of `func`.
*/
function apply(func, thisArg, args) {
- var length = args.length;
- switch (length) {
+ switch (args.length) {
case 0: return func.call(thisArg);
case 1: return func.call(thisArg, args[0]);
case 2: return func.call(thisArg, args[0], args[1]);
@@ -721,7 +754,7 @@
*/
function baseIndexOf(array, value, fromIndex) {
if (value !== value) {
- return indexOfNaN(array, fromIndex);
+ return baseFindIndex(array, baseIsNaN, fromIndex);
}
var index = fromIndex - 1,
length = array.length;
@@ -756,6 +789,17 @@
return -1;
}
+ /**
+ * The base implementation of `_.isNaN` without support for number objects.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+ */
+ function baseIsNaN(value) {
+ return value !== value;
+ }
+
/**
* The base implementation of `_.mean` and `_.meanBy` without support for
* iteratee shorthands.
@@ -770,6 +814,32 @@
return length ? (baseSum(array, iteratee) / length) : NAN;
}
+ /**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new accessor function.
+ */
+ function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined : object[key];
+ };
+ }
+
+ /**
+ * The base implementation of `_.propertyOf` without support for deep paths.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Function} Returns the new accessor function.
+ */
+ function basePropertyOf(object) {
+ return function(key) {
+ return object == null ? undefined : object[key];
+ };
+ }
+
/**
* The base implementation of `_.reduce` and `_.reduceRight`, without support
* for iteratee shorthands, which iterates over `collection` using `eachFunc`.
@@ -870,7 +940,7 @@
}
/**
- * The base implementation of `_.unary` without support for storing wrapper metadata.
+ * The base implementation of `_.unary` without support for storing metadata.
*
* @private
* @param {Function} func The function to cap arguments for.
@@ -943,17 +1013,6 @@
return index;
}
- /**
- * Checks if `value` is a global object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {null|Object} Returns `value` if it's a global object, else `null`.
- */
- function checkGlobal(value) {
- return (value && value.Object === Object) ? value : null;
- }
-
/**
* Gets the number of `placeholder` occurrences in `array`.
*
@@ -981,9 +1040,7 @@
* @param {string} letter The matched letter to deburr.
* @returns {string} Returns the deburred letter.
*/
- function deburrLetter(letter) {
- return deburredLetters[letter];
- }
+ var deburrLetter = basePropertyOf(deburredLetters);
/**
* Used by `_.escape` to convert characters to HTML entities.
@@ -992,9 +1049,7 @@
* @param {string} chr The matched character to escape.
* @returns {string} Returns the escaped character.
*/
- function escapeHtmlChar(chr) {
- return htmlEscapes[chr];
- }
+ var escapeHtmlChar = basePropertyOf(htmlEscapes);
/**
* Used by `_.template` to escape characters for inclusion in compiled string literals.
@@ -1019,28 +1074,6 @@
return object == null ? undefined : object[key];
}
- /**
- * Gets the index at which the first occurrence of `NaN` is found in `array`.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {number} fromIndex The index to search from.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {number} Returns the index of the matched `NaN`, else `-1`.
- */
- function indexOfNaN(array, fromIndex, fromRight) {
- var length = array.length,
- index = fromIndex + (fromRight ? 1 : -1);
-
- while ((fromRight ? index-- : ++index < length)) {
- var other = array[index];
- if (other !== other) {
- return index;
- }
- }
- return -1;
- }
-
/**
* Checks if `value` is a host object in IE < 9.
*
@@ -1094,6 +1127,20 @@
return result;
}
+ /**
+ * Creates a function that invokes `func` with its first argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
+ function overArg(func, transform) {
+ return function(arg) {
+ return func(transform(arg));
+ };
+ }
+
/**
* Replaces all `placeholder` elements in `array` with an internal placeholder
* and returns an array of their indexes.
@@ -1189,9 +1236,7 @@
* @param {string} chr The matched character to unescape.
* @returns {string} Returns the unescaped character.
*/
- function unescapeHtmlChar(chr) {
- return htmlUnescapes[chr];
- }
+ var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
/*--------------------------------------------------------------------------*/
@@ -1235,7 +1280,8 @@
context = context ? _.defaults({}, context, _.pick(root, contextProps)) : root;
/** Built-in constructor references. */
- var Date = context.Date,
+ var Array = context.Array,
+ Date = context.Date,
Error = context.Error,
Math = context.Math,
RegExp = context.RegExp,
@@ -1289,19 +1335,22 @@
Symbol = context.Symbol,
Uint8Array = context.Uint8Array,
enumerate = Reflect ? Reflect.enumerate : undefined,
- getOwnPropertySymbols = Object.getOwnPropertySymbols,
- iteratorSymbol = typeof (iteratorSymbol = Symbol && Symbol.iterator) == 'symbol' ? iteratorSymbol : undefined,
- objectCreate = Object.create,
+ iteratorSymbol = Symbol ? Symbol.iterator : undefined,
+ objectCreate = context.Object.create,
propertyIsEnumerable = objectProto.propertyIsEnumerable,
- splice = arrayProto.splice;
+ splice = arrayProto.splice,
+ spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
/** Built-in method references that are mockable. */
- var setTimeout = function(func, wait) { return context.setTimeout.call(root, func, wait); };
+ var clearTimeout = function(id) { return context.clearTimeout.call(root, id); },
+ setTimeout = function(func, wait) { return context.setTimeout.call(root, func, wait); };
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeCeil = Math.ceil,
nativeFloor = Math.floor,
nativeGetPrototype = Object.getPrototypeOf,
+ nativeGetSymbols = Object.getOwnPropertySymbols,
+ nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
nativeIsFinite = context.isFinite,
nativeJoin = arrayProto.join,
nativeKeys = Object.keys,
@@ -1319,7 +1368,15 @@
Promise = getNative(context, 'Promise'),
Set = getNative(context, 'Set'),
WeakMap = getNative(context, 'WeakMap'),
- nativeCreate = getNative(Object, 'create');
+ nativeCreate = getNative(context.Object, 'create');
+
+ /* Used to set `toString` methods. */
+ var defineProperty = (function() {
+ var func = getNative(context.Object, 'defineProperty'),
+ name = getNative.name;
+
+ return (name && name.length > 2) ? func : undefined;
+ }());
/** Used to store function metadata. */
var metaMap = WeakMap && new WeakMap;
@@ -1410,16 +1467,16 @@
*
* The wrapper methods that are **not** chainable by default are:
* `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
- * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `deburr`, `divide`, `each`,
- * `eachRight`, `endsWith`, `eq`, `escape`, `escapeRegExp`, `every`, `find`,
- * `findIndex`, `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `first`,
- * `floor`, `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`,
- * `forOwnRight`, `get`, `gt`, `gte`, `has`, `hasIn`, `head`, `identity`,
- * `includes`, `indexOf`, `inRange`, `invoke`, `isArguments`, `isArray`,
- * `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`,
- * `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`,
- * `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMap`,
- * `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
+ * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
+ * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
+ * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
+ * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
+ * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
+ * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
+ * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
+ * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
+ * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
+ * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
* `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
* `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
* `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
@@ -2122,8 +2179,13 @@
*/
function stackSet(key, value) {
var cache = this.__data__;
- if (cache instanceof ListCache && cache.__data__.length == LARGE_ARRAY_SIZE) {
- cache = this.__data__ = new MapCache(cache.__data__);
+ if (cache instanceof ListCache) {
+ var pairs = cache.__data__;
+ if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+ pairs.push([key, value]);
+ return this;
+ }
+ cache = this.__data__ = new MapCache(pairs);
}
cache.set(key, value);
return this;
@@ -2260,7 +2322,7 @@
}
/**
- * The base implementation of `_.clamp` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.clamp` which doesn't coerce arguments.
*
* @private
* @param {number} number The number to clamp.
@@ -2344,14 +2406,17 @@
if (!isArr) {
var props = isFull ? getAllKeys(value) : keys(value);
}
- // Recursively populate clone (susceptible to call stack limits).
arrayEach(props || value, function(subValue, key) {
if (props) {
key = subValue;
subValue = value[key];
}
+ // Recursively populate clone (susceptible to call stack limits).
assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
});
+ if (!isFull) {
+ stack['delete'](value);
+ }
return result;
}
@@ -2363,28 +2428,39 @@
* @returns {Function} Returns the new spec function.
*/
function baseConforms(source) {
- var props = keys(source),
- length = props.length;
-
+ var props = keys(source);
return function(object) {
- if (object == null) {
- return !length;
- }
- var index = length;
- while (index--) {
- var key = props[index],
- predicate = source[key],
- value = object[key];
-
- if ((value === undefined &&
- !(key in Object(object))) || !predicate(value)) {
- return false;
- }
- }
- return true;
+ return baseConformsTo(object, source, props);
};
}
+ /**
+ * The base implementation of `_.conformsTo` which accepts `props` to check.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+ */
+ function baseConformsTo(object, source, props) {
+ var length = props.length;
+ if (object == null) {
+ return !length;
+ }
+ var index = length;
+ while (index--) {
+ var key = props[index],
+ predicate = source[key],
+ value = object[key];
+
+ if ((value === undefined &&
+ !(key in Object(object))) || !predicate(value)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
/**
* The base implementation of `_.create` without support for assigning
* properties to the created object.
@@ -2398,13 +2474,13 @@
}
/**
- * The base implementation of `_.delay` and `_.defer` which accepts an array
- * of `func` arguments.
+ * The base implementation of `_.delay` and `_.defer` which accepts `args`
+ * to provide to `func`.
*
* @private
* @param {Function} func The function to delay.
* @param {number} wait The number of milliseconds to delay invocation.
- * @param {Object} args The arguments to provide to `func`.
+ * @param {Array} args The arguments to provide to `func`.
* @returns {number} Returns the timer id.
*/
function baseDelay(func, wait, args) {
@@ -2718,7 +2794,18 @@
}
/**
- * The base implementation of `_.gt` which doesn't coerce arguments to numbers.
+ * The base implementation of `getTag`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+ function baseGetTag(value) {
+ return objectToString.call(value);
+ }
+
+ /**
+ * The base implementation of `_.gt` which doesn't coerce arguments.
*
* @private
* @param {*} value The value to compare.
@@ -2760,7 +2847,7 @@
}
/**
- * The base implementation of `_.inRange` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.inRange` which doesn't coerce arguments.
*
* @private
* @param {number} number The number to check.
@@ -2873,6 +2960,28 @@
return func == null ? undefined : apply(func, object, args);
}
+ /**
+ * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+ */
+ function baseIsArrayBuffer(value) {
+ return isObjectLike(value) && objectToString.call(value) == arrayBufferTag;
+ }
+
+ /**
+ * The base implementation of `_.isDate` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+ */
+ function baseIsDate(value) {
+ return isObjectLike(value) && objectToString.call(value) == dateTag;
+ }
+
/**
* The base implementation of `_.isEqual` which supports partial comparisons
* and tracks traversed objects.
@@ -2956,6 +3065,17 @@
return equalObjects(object, other, equalFunc, customizer, bitmask, stack);
}
+ /**
+ * The base implementation of `_.isMap` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+ */
+ function baseIsMap(value) {
+ return isObjectLike(value) && getTag(value) == mapTag;
+ }
+
/**
* The base implementation of `_.isMatch` without support for iteratee shorthands.
*
@@ -3026,6 +3146,40 @@
return pattern.test(toSource(value));
}
+ /**
+ * The base implementation of `_.isRegExp` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+ */
+ function baseIsRegExp(value) {
+ return isObject(value) && objectToString.call(value) == regexpTag;
+ }
+
+ /**
+ * The base implementation of `_.isSet` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+ */
+ function baseIsSet(value) {
+ return isObjectLike(value) && getTag(value) == setTag;
+ }
+
+ /**
+ * The base implementation of `_.isTypedArray` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ */
+ function baseIsTypedArray(value) {
+ return isObjectLike(value) &&
+ isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
+ }
+
/**
* The base implementation of `_.iteratee`.
*
@@ -3058,9 +3212,7 @@
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
- function baseKeys(object) {
- return nativeKeys(Object(object));
- }
+ var baseKeys = overArg(nativeKeys, Object);
/**
* The base implementation of `_.keysIn` which doesn't skip the constructor
@@ -3088,7 +3240,7 @@
}
/**
- * The base implementation of `_.lt` which doesn't coerce arguments to numbers.
+ * The base implementation of `_.lt` which doesn't coerce arguments.
*
* @private
* @param {*} value The value to compare.
@@ -3255,18 +3407,17 @@
isCommon = false;
}
}
- stack.set(srcValue, newValue);
-
if (isCommon) {
// Recursively merge objects and arrays (susceptible to call stack limits).
+ stack.set(srcValue, newValue);
mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+ stack['delete'](srcValue);
}
- stack['delete'](srcValue);
assignMergeValue(object, key, newValue);
}
/**
- * The base implementation of `_.nth` which doesn't coerce `n` to an integer.
+ * The base implementation of `_.nth` which doesn't coerce arguments.
*
* @private
* @param {Array} array The array to query.
@@ -3318,12 +3469,9 @@
*/
function basePick(object, props) {
object = Object(object);
- return arrayReduce(props, function(result, key) {
- if (key in object) {
- result[key] = object[key];
- }
- return result;
- }, {});
+ return basePickBy(object, props, function(value, key) {
+ return key in object;
+ });
}
/**
@@ -3331,12 +3479,12 @@
*
* @private
* @param {Object} object The source object.
+ * @param {string[]} props The property identifiers to pick from.
* @param {Function} predicate The function invoked per property.
* @returns {Object} Returns the new object.
*/
- function basePickBy(object, predicate) {
+ function basePickBy(object, props, predicate) {
var index = -1,
- props = getAllKeysIn(object),
length = props.length,
result = {};
@@ -3351,19 +3499,6 @@
return result;
}
- /**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new accessor function.
- */
- function baseProperty(key) {
- return function(object) {
- return object == null ? undefined : object[key];
- };
- }
-
/**
* A specialized version of `baseProperty` which supports deep paths.
*
@@ -3466,7 +3601,7 @@
/**
* The base implementation of `_.range` and `_.rangeRight` which doesn't
- * coerce arguments to numbers.
+ * coerce arguments.
*
* @private
* @param {number} start The start of the range.
@@ -3515,6 +3650,35 @@
return result;
}
+ /**
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ */
+ function baseRest(func, start) {
+ start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+ return function() {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ array = Array(length);
+
+ while (++index < length) {
+ array[index] = args[start + index];
+ }
+ index = -1;
+ var otherArgs = Array(start + 1);
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = array;
+ return apply(func, this, otherArgs);
+ };
+ }
+
/**
* The base implementation of `_.set`.
*
@@ -4294,9 +4458,9 @@
var newValue = customizer
? customizer(object[key], source[key], key, object, source)
- : source[key];
+ : undefined;
- assignValue(object, key, newValue);
+ assignValue(object, key, newValue === undefined ? source[key] : newValue);
}
return object;
}
@@ -4326,7 +4490,7 @@
var func = isArray(collection) ? arrayAggregator : baseAggregator,
accumulator = initializer ? initializer() : {};
- return func(collection, setter, getIteratee(iteratee), accumulator);
+ return func(collection, setter, getIteratee(iteratee, 2), accumulator);
};
}
@@ -4338,7 +4502,7 @@
* @returns {Function} Returns the new assigner function.
*/
function createAssigner(assigner) {
- return rest(function(object, sources) {
+ return baseRest(function(object, sources) {
var index = -1,
length = sources.length,
customizer = length > 1 ? sources[length - 1] : undefined,
@@ -4422,14 +4586,13 @@
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {*} [thisArg] The `this` binding of `func`.
* @returns {Function} Returns the new wrapped function.
*/
- function createBaseWrapper(func, bitmask, thisArg) {
+ function createBind(func, bitmask, thisArg) {
var isBind = bitmask & BIND_FLAG,
- Ctor = createCtorWrapper(func);
+ Ctor = createCtor(func);
function wrapper() {
var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
@@ -4486,7 +4649,7 @@
* @param {Function} Ctor The constructor to wrap.
* @returns {Function} Returns the new wrapped function.
*/
- function createCtorWrapper(Ctor) {
+ function createCtor(Ctor) {
return function() {
// Use a `switch` statement to work with class constructors. See
// http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
@@ -4516,13 +4679,12 @@
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {number} arity The arity of `func`.
* @returns {Function} Returns the new wrapped function.
*/
- function createCurryWrapper(func, bitmask, arity) {
- var Ctor = createCtorWrapper(func);
+ function createCurry(func, bitmask, arity) {
+ var Ctor = createCtor(func);
function wrapper() {
var length = arguments.length,
@@ -4539,8 +4701,8 @@
length -= holders.length;
if (length < arity) {
- return createRecurryWrapper(
- func, bitmask, createHybridWrapper, wrapper.placeholder, undefined,
+ return createRecurry(
+ func, bitmask, createHybrid, wrapper.placeholder, undefined,
args, holders, undefined, undefined, arity - length);
}
var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
@@ -4559,18 +4721,13 @@
function createFind(findIndexFunc) {
return function(collection, predicate, fromIndex) {
var iterable = Object(collection);
- predicate = getIteratee(predicate, 3);
if (!isArrayLike(collection)) {
- var props = keys(collection);
+ var iteratee = getIteratee(predicate, 3);
+ collection = keys(collection);
+ predicate = function(key) { return iteratee(iterable[key], key, iterable); };
}
- var index = findIndexFunc(props || collection, function(value, key) {
- if (props) {
- key = value;
- value = iterable[key];
- }
- return predicate(value, key, iterable);
- }, fromIndex);
- return index > -1 ? collection[props ? props[index] : index] : undefined;
+ var index = findIndexFunc(collection, predicate, fromIndex);
+ return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
};
}
@@ -4582,7 +4739,7 @@
* @returns {Function} Returns the new flow function.
*/
function createFlow(fromRight) {
- return rest(function(funcs) {
+ return baseRest(function(funcs) {
funcs = baseFlatten(funcs, 1);
var length = funcs.length,
@@ -4644,8 +4801,7 @@
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {*} [thisArg] The `this` binding of `func`.
* @param {Array} [partials] The arguments to prepend to those provided to
* the new function.
@@ -4658,13 +4814,13 @@
* @param {number} [arity] The arity of `func`.
* @returns {Function} Returns the new wrapped function.
*/
- function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
+ function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
var isAry = bitmask & ARY_FLAG,
isBind = bitmask & BIND_FLAG,
isBindKey = bitmask & BIND_KEY_FLAG,
isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG),
isFlip = bitmask & FLIP_FLAG,
- Ctor = isBindKey ? undefined : createCtorWrapper(func);
+ Ctor = isBindKey ? undefined : createCtor(func);
function wrapper() {
var length = arguments.length,
@@ -4687,8 +4843,8 @@
length -= holdersCount;
if (isCurried && length < arity) {
var newHolders = replaceHolders(args, placeholder);
- return createRecurryWrapper(
- func, bitmask, createHybridWrapper, wrapper.placeholder, thisArg,
+ return createRecurry(
+ func, bitmask, createHybrid, wrapper.placeholder, thisArg,
args, newHolders, argPos, ary, arity - length
);
}
@@ -4705,7 +4861,7 @@
args.length = ary;
}
if (this && this !== root && this instanceof wrapper) {
- fn = Ctor || createCtorWrapper(fn);
+ fn = Ctor || createCtor(fn);
}
return fn.apply(thisBinding, args);
}
@@ -4731,13 +4887,14 @@
*
* @private
* @param {Function} operator The function to perform the operation.
+ * @param {number} [defaultValue] The value used for `undefined` arguments.
* @returns {Function} Returns the new mathematical operation function.
*/
- function createMathOperation(operator) {
+ function createMathOperation(operator, defaultValue) {
return function(value, other) {
var result;
if (value === undefined && other === undefined) {
- return 0;
+ return defaultValue;
}
if (value !== undefined) {
result = value;
@@ -4767,12 +4924,12 @@
* @returns {Function} Returns the new over function.
*/
function createOver(arrayFunc) {
- return rest(function(iteratees) {
+ return baseRest(function(iteratees) {
iteratees = (iteratees.length == 1 && isArray(iteratees[0]))
? arrayMap(iteratees[0], baseUnary(getIteratee()))
- : arrayMap(baseFlatten(iteratees, 1, isFlattenableIteratee), baseUnary(getIteratee()));
+ : arrayMap(baseFlatten(iteratees, 1), baseUnary(getIteratee()));
- return rest(function(args) {
+ return baseRest(function(args) {
var thisArg = this;
return arrayFunc(iteratees, function(iteratee) {
return apply(iteratee, thisArg, args);
@@ -4809,16 +4966,15 @@
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {*} thisArg The `this` binding of `func`.
* @param {Array} partials The arguments to prepend to those provided to
* the new function.
* @returns {Function} Returns the new wrapped function.
*/
- function createPartialWrapper(func, bitmask, thisArg, partials) {
+ function createPartial(func, bitmask, thisArg, partials) {
var isBind = bitmask & BIND_FLAG,
- Ctor = createCtorWrapper(func);
+ Ctor = createCtor(func);
function wrapper() {
var argsIndex = -1,
@@ -4887,8 +5043,7 @@
*
* @private
* @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 flags. See `createWrap` for more details.
* @param {Function} wrapFunc The function to create the `func` wrapper.
* @param {*} placeholder The placeholder value.
* @param {*} [thisArg] The `this` binding of `func`.
@@ -4900,7 +5055,7 @@
* @param {number} [arity] The arity of `func`.
* @returns {Function} Returns the new wrapped function.
*/
- function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
+ function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
var isCurry = bitmask & CURRY_FLAG,
newHolders = isCurry ? holders : undefined,
newHoldersRight = isCurry ? undefined : holders,
@@ -4923,7 +5078,7 @@
setData(result, newData);
}
result.placeholder = placeholder;
- return result;
+ return setWrapToString(result, func, bitmask);
}
/**
@@ -4952,7 +5107,7 @@
}
/**
- * Creates a set of `values`.
+ * Creates a set object of `values`.
*
* @private
* @param {Array} values The values to add to the set.
@@ -4988,7 +5143,7 @@
*
* @private
* @param {Function|string} func The function or method name to wrap.
- * @param {number} bitmask The bitmask of wrapper flags.
+ * @param {number} bitmask The bitmask flags.
* The bitmask may be composed of the following flags:
* 1 - `_.bind`
* 2 - `_.bindKey`
@@ -5008,7 +5163,7 @@
* @param {number} [arity] The arity of `func`.
* @returns {Function} Returns the new wrapped function.
*/
- function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
+ function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
var isBindKey = bitmask & BIND_KEY_FLAG;
if (!isBindKey && typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
@@ -5051,16 +5206,16 @@
bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG);
}
if (!bitmask || bitmask == BIND_FLAG) {
- var result = createBaseWrapper(func, bitmask, thisArg);
+ var result = createBind(func, bitmask, thisArg);
} else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) {
- result = createCurryWrapper(func, bitmask, arity);
+ result = createCurry(func, bitmask, arity);
} else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) {
- result = createPartialWrapper(func, bitmask, thisArg, partials);
+ result = createPartial(func, bitmask, thisArg, partials);
} else {
- result = createHybridWrapper.apply(undefined, newData);
+ result = createHybrid.apply(undefined, newData);
}
var setter = data ? baseSetData : setData;
- return setter(result, newData);
+ return setWrapToString(setter(result, newData), func, bitmask);
}
/**
@@ -5087,7 +5242,7 @@
}
// Assume cyclic values are equal.
var stacked = stack.get(array);
- if (stacked) {
+ if (stacked && stack.get(other)) {
return stacked == other;
}
var index = -1,
@@ -5095,6 +5250,7 @@
seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;
stack.set(array, other);
+ stack.set(other, array);
// Ignore non-index properties.
while (++index < arrLength) {
@@ -5173,18 +5329,14 @@
case boolTag:
case dateTag:
- // Coerce dates and booleans to numbers, dates to milliseconds and
- // booleans to `1` or `0` treating invalid dates coerced to `NaN` as
- // not equal.
- return +object == +other;
+ case numberTag:
+ // Coerce booleans to `1` or `0` and dates to milliseconds.
+ // Invalid dates are coerced to `NaN`.
+ return eq(+object, +other);
case errorTag:
return object.name == other.name && object.message == other.message;
- case numberTag:
- // Treat `NaN` vs. `NaN` as equal.
- return (object != +object) ? other != +other : object == +other;
-
case regexpTag:
case stringTag:
// Coerce regexes to strings and treat strings, primitives and objects,
@@ -5208,10 +5360,12 @@
return stacked == other;
}
bitmask |= UNORDERED_COMPARE_FLAG;
- stack.set(object, other);
// Recursively compare objects (susceptible to call stack limits).
- return equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
+ stack.set(object, other);
+ var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
+ stack['delete'](object);
+ return result;
case symbolTag:
if (symbolValueOf) {
@@ -5254,11 +5408,12 @@
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
- if (stacked) {
+ if (stacked && stack.get(other)) {
return stacked == other;
}
var result = true;
stack.set(object, other);
+ stack.set(other, object);
var skipCtor = isPartial;
while (++index < objLength) {
@@ -5450,9 +5605,7 @@
* @param {*} value The value to query.
* @returns {null|Object} Returns the `[[Prototype]]`.
*/
- function getPrototype(value) {
- return nativeGetPrototype(Object(value));
- }
+ var getPrototype = overArg(nativeGetPrototype, Object);
/**
* Creates an array of the own enumerable symbol properties of `object`.
@@ -5461,16 +5614,7 @@
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
- function getSymbols(object) {
- // 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 = stubArray;
- }
+ var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;
/**
* Creates an array of the own and inherited enumerable symbol properties
@@ -5480,7 +5624,7 @@
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
- var getSymbolsIn = !getOwnPropertySymbols ? getSymbols : function(object) {
+ var getSymbolsIn = !nativeGetSymbols ? getSymbols : function(object) {
var result = [];
while (object) {
arrayPush(result, getSymbols(object));
@@ -5496,9 +5640,7 @@
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
- function getTag(value) {
- return objectToString.call(value);
- }
+ var getTag = baseGetTag;
// Fallback for data views, maps, sets, and weak maps in IE 11,
// for data views in Edge, and promises in Node.js.
@@ -5553,6 +5695,18 @@
return { 'start': start, 'end': end };
}
+ /**
+ * Extracts wrapper details from the `source` body comment.
+ *
+ * @private
+ * @param {string} source The source to inspect.
+ * @returns {Array} Returns the wrapper details.
+ */
+ function getWrapDetails(source) {
+ var match = source.match(reWrapDetails);
+ return match ? match[1].split(reSplitDetails) : [];
+ }
+
/**
* Checks if `path` exists on `object`.
*
@@ -5682,6 +5836,23 @@
return null;
}
+ /**
+ * Inserts wrapper `details` in a comment at the top of the `source` body.
+ *
+ * @private
+ * @param {string} source The source to modify.
+ * @returns {Array} details The details to insert.
+ * @returns {string} Returns the modified source.
+ */
+ function insertWrapDetails(source, details) {
+ var length = details.length,
+ lastIndex = length - 1;
+
+ details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
+ details = details.join(length > 2 ? ', ' : ' ');
+ return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
+ }
+
/**
* Checks if `value` is a flattenable `arguments` object or array.
*
@@ -5690,19 +5861,8 @@
* @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
*/
function isFlattenable(value) {
- return isArray(value) || isArguments(value);
- }
-
- /**
- * Checks if `value` is a flattenable array and not a `_.matchesProperty`
- * iteratee shorthand.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
- */
- function isFlattenableIteratee(value) {
- return isArray(value) && !(value.length == 2 && !isFunction(value[0]));
+ return isArray(value) || isArguments(value) ||
+ !!(spreadableSymbol && value && value[spreadableSymbol])
}
/**
@@ -5952,7 +6112,10 @@
*/
function mergeDefaults(objValue, srcValue, key, object, source, stack) {
if (isObject(objValue) && isObject(srcValue)) {
- baseMerge(objValue, srcValue, undefined, mergeDefaults, stack.set(srcValue, objValue));
+ // Recursively merge objects and arrays (susceptible to call stack limits).
+ stack.set(srcValue, objValue);
+ baseMerge(objValue, srcValue, undefined, mergeDefaults, stack);
+ stack['delete'](srcValue);
}
return objValue;
}
@@ -6025,6 +6188,25 @@
};
}());
+ /**
+ * Sets the `toString` method of `wrapper` to mimic the source of `reference`
+ * with wrapper details in a comment at the top of the source body.
+ *
+ * @private
+ * @param {Function} wrapper The function to modify.
+ * @param {Function} reference The reference function.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @returns {Function} Returns `wrapper`.
+ */
+ var setWrapToString = !defineProperty ? identity : function(wrapper, reference, bitmask) {
+ var source = (reference + '');
+ return defineProperty(wrapper, 'toString', {
+ 'configurable': true,
+ 'enumerable': false,
+ 'value': constant(insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)))
+ });
+ };
+
/**
* Converts `string` to a property path array.
*
@@ -6074,6 +6256,24 @@
return '';
}
+ /**
+ * Updates wrapper `details` based on `bitmask` flags.
+ *
+ * @private
+ * @returns {Array} details The details to modify.
+ * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+ * @returns {Array} Returns `details`.
+ */
+ function updateWrapDetails(details, bitmask) {
+ arrayEach(wrapFlags, function(pair) {
+ var value = '_.' + pair[0];
+ if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
+ details.push(value);
+ }
+ });
+ return details.sort();
+ }
+
/**
* Creates a clone of `wrapper`.
*
@@ -6202,11 +6402,13 @@
}
/**
- * Creates an array of unique `array` values not included in the other given
- * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * Creates an array of `array` values not included in the other given arrays
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons. The order of result values is determined by the
* order they occur in the first array.
*
+ * **Note:** Unlike `_.pullAll`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 0.1.0
@@ -6220,7 +6422,7 @@
* _.difference([2, 1], [2, 3]);
* // => [1]
*/
- var difference = rest(function(array, values) {
+ var difference = baseRest(function(array, values) {
return isArrayLikeObject(array)
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
: [];
@@ -6232,14 +6434,15 @@
* by which they're compared. Result values are chosen from the first array.
* The iteratee is invoked with one argument: (value).
*
+ * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 4.0.0
* @category Array
* @param {Array} array The array to inspect.
* @param {...Array} [values] The values to exclude.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {Array} Returns the new array of filtered values.
* @example
*
@@ -6250,13 +6453,13 @@
* _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
* // => [{ 'x': 2 }]
*/
- var differenceBy = rest(function(array, values) {
+ var differenceBy = baseRest(function(array, values) {
var iteratee = last(values);
if (isArrayLikeObject(iteratee)) {
iteratee = undefined;
}
return isArrayLikeObject(array)
- ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee))
+ ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
: [];
});
@@ -6266,6 +6469,8 @@
* are chosen from the first array. The comparator is invoked with two arguments:
* (arrVal, othVal).
*
+ * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 4.0.0
@@ -6281,7 +6486,7 @@
* _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
* // => [{ 'x': 2, 'y': 1 }]
*/
- var differenceWith = rest(function(array, values) {
+ var differenceWith = baseRest(function(array, values) {
var comparator = last(values);
if (isArrayLikeObject(comparator)) {
comparator = undefined;
@@ -6370,8 +6575,7 @@
* @since 3.0.0
* @category Array
* @param {Array} array The array to query.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {Array} Returns the slice of `array`.
* @example
*
@@ -6412,7 +6616,7 @@
* @since 3.0.0
* @category Array
* @param {Array} array The array to query.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the slice of `array`.
* @example
@@ -6494,7 +6698,7 @@
* @since 1.1.0
* @category Array
* @param {Array} array The array to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=0] The index to search from.
* @returns {number} Returns the index of the found element, else `-1`.
@@ -6542,7 +6746,7 @@
* @since 2.0.0
* @category Array
* @param {Array} array The array to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=array.length-1] The index to search from.
* @returns {number} Returns the index of the found element, else `-1`.
@@ -6663,8 +6867,8 @@
* @returns {Object} Returns the new object.
* @example
*
- * _.fromPairs([['fred', 30], ['barney', 40]]);
- * // => { 'fred': 30, 'barney': 40 }
+ * _.fromPairs([['a', 1], ['b', 2]]);
+ * // => { 'a': 1, 'b': 2 }
*/
function fromPairs(pairs) {
var index = -1,
@@ -6770,7 +6974,7 @@
* _.intersection([2, 1], [2, 3]);
* // => [2]
*/
- var intersection = rest(function(arrays) {
+ var intersection = baseRest(function(arrays) {
var mapped = arrayMap(arrays, castArrayLikeObject);
return (mapped.length && mapped[0] === arrays[0])
? baseIntersection(mapped)
@@ -6788,8 +6992,7 @@
* @since 4.0.0
* @category Array
* @param {...Array} [arrays] The arrays to inspect.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {Array} Returns the new array of intersecting values.
* @example
*
@@ -6800,7 +7003,7 @@
* _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
* // => [{ 'x': 1 }]
*/
- var intersectionBy = rest(function(arrays) {
+ var intersectionBy = baseRest(function(arrays) {
var iteratee = last(arrays),
mapped = arrayMap(arrays, castArrayLikeObject);
@@ -6810,7 +7013,7 @@
mapped.pop();
}
return (mapped.length && mapped[0] === arrays[0])
- ? baseIntersection(mapped, getIteratee(iteratee))
+ ? baseIntersection(mapped, getIteratee(iteratee, 2))
: [];
});
@@ -6835,7 +7038,7 @@
* _.intersectionWith(objects, others, _.isEqual);
* // => [{ 'x': 1, 'y': 2 }]
*/
- var intersectionWith = rest(function(arrays) {
+ var intersectionWith = baseRest(function(arrays) {
var comparator = last(arrays),
mapped = arrayMap(arrays, castArrayLikeObject);
@@ -6923,7 +7126,7 @@
) + 1;
}
if (value !== value) {
- return indexOfNaN(array, index - 1, true);
+ return baseFindIndex(array, baseIsNaN, index - 1, true);
}
while (index--) {
if (array[index] === value) {
@@ -6981,7 +7184,7 @@
* console.log(array);
* // => ['b', 'b']
*/
- var pull = rest(pullAll);
+ var pull = baseRest(pullAll);
/**
* This method is like `_.pull` except that it accepts an array of values to remove.
@@ -7022,7 +7225,7 @@
* @category Array
* @param {Array} array The array to modify.
* @param {Array} values The values to remove.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {Array} Returns `array`.
* @example
@@ -7035,7 +7238,7 @@
*/
function pullAllBy(array, values, iteratee) {
return (array && array.length && values && values.length)
- ? basePullAll(array, values, getIteratee(iteratee))
+ ? basePullAll(array, values, getIteratee(iteratee, 2))
: array;
}
@@ -7092,7 +7295,7 @@
* console.log(pulled);
* // => ['b', 'd']
*/
- var pullAt = rest(function(array, indexes) {
+ var pullAt = baseRest(function(array, indexes) {
indexes = baseFlatten(indexes, 1);
var length = array ? array.length : 0,
@@ -7118,7 +7321,7 @@
* @since 2.0.0
* @category Array
* @param {Array} array The array to modify.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new array of removed elements.
* @example
@@ -7246,7 +7449,7 @@
* @category Array
* @param {Array} array The sorted array to inspect.
* @param {*} value The value to evaluate.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
@@ -7262,7 +7465,7 @@
* // => 0
*/
function sortedIndexBy(array, value, iteratee) {
- return baseSortedIndexBy(array, value, getIteratee(iteratee));
+ return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
}
/**
@@ -7325,7 +7528,7 @@
* @category Array
* @param {Array} array The sorted array to inspect.
* @param {*} value The value to evaluate.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
@@ -7341,7 +7544,7 @@
* // => 1
*/
function sortedLastIndexBy(array, value, iteratee) {
- return baseSortedIndexBy(array, value, getIteratee(iteratee), true);
+ return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
}
/**
@@ -7410,7 +7613,7 @@
*/
function sortedUniqBy(array, iteratee) {
return (array && array.length)
- ? baseSortedUniq(array, getIteratee(iteratee))
+ ? baseSortedUniq(array, getIteratee(iteratee, 2))
: [];
}
@@ -7510,7 +7713,7 @@
* @since 3.0.0
* @category Array
* @param {Array} array The array to query.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the slice of `array`.
* @example
@@ -7552,7 +7755,7 @@
* @since 3.0.0
* @category Array
* @param {Array} array The array to query.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the slice of `array`.
* @example
@@ -7600,14 +7803,15 @@
* _.union([2], [1, 2]);
* // => [2, 1]
*/
- var union = rest(function(arrays) {
+ var union = baseRest(function(arrays) {
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
});
/**
* This method is like `_.union` except that it accepts `iteratee` which is
* invoked for each element of each `arrays` to generate the criterion by
- * which uniqueness is computed. The iteratee is invoked with one argument:
+ * which uniqueness is computed. Result values are chosen from the first
+ * array in which the value occurs. The iteratee is invoked with one argument:
* (value).
*
* @static
@@ -7615,7 +7819,7 @@
* @since 4.0.0
* @category Array
* @param {...Array} [arrays] The arrays to inspect.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {Array} Returns the new array of combined values.
* @example
@@ -7627,17 +7831,18 @@
* _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
* // => [{ 'x': 1 }, { 'x': 2 }]
*/
- var unionBy = rest(function(arrays) {
+ var unionBy = baseRest(function(arrays) {
var iteratee = last(arrays);
if (isArrayLikeObject(iteratee)) {
iteratee = undefined;
}
- return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee));
+ return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
});
/**
* This method is like `_.union` except that it accepts `comparator` which
- * is invoked to compare elements of `arrays`. The comparator is invoked
+ * is invoked to compare elements of `arrays`. Result values are chosen from
+ * the first array in which the value occurs. The comparator is invoked
* with two arguments: (arrVal, othVal).
*
* @static
@@ -7655,7 +7860,7 @@
* _.unionWith(objects, others, _.isEqual);
* // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
*/
- var unionWith = rest(function(arrays) {
+ var unionWith = baseRest(function(arrays) {
var comparator = last(arrays);
if (isArrayLikeObject(comparator)) {
comparator = undefined;
@@ -7696,7 +7901,7 @@
* @since 4.0.0
* @category Array
* @param {Array} array The array to inspect.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {Array} Returns the new duplicate free array.
* @example
@@ -7710,7 +7915,7 @@
*/
function uniqBy(array, iteratee) {
return (array && array.length)
- ? baseUniq(array, getIteratee(iteratee))
+ ? baseUniq(array, getIteratee(iteratee, 2))
: [];
}
@@ -7752,11 +7957,11 @@
* @returns {Array} Returns the new array of regrouped elements.
* @example
*
- * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);
- * // => [['fred', 30, true], ['barney', 40, false]]
+ * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
+ * // => [['a', 1, true], ['b', 2, false]]
*
* _.unzip(zipped);
- * // => [['fred', 'barney'], [30, 40], [true, false]]
+ * // => [['a', 'b'], [1, 2], [true, false]]
*/
function unzip(array) {
if (!(array && array.length)) {
@@ -7813,6 +8018,8 @@
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons.
*
+ * **Note:** Unlike `_.pull`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 0.1.0
@@ -7826,7 +8033,7 @@
* _.without([2, 1, 2, 3], 1, 2);
* // => [3]
*/
- var without = rest(function(array, values) {
+ var without = baseRest(function(array, values) {
return isArrayLikeObject(array)
? baseDifference(array, values)
: [];
@@ -7850,7 +8057,7 @@
* _.xor([2, 1], [2, 3]);
* // => [1, 3]
*/
- var xor = rest(function(arrays) {
+ var xor = baseRest(function(arrays) {
return baseXor(arrayFilter(arrays, isArrayLikeObject));
});
@@ -7865,7 +8072,7 @@
* @since 4.0.0
* @category Array
* @param {...Array} [arrays] The arrays to inspect.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {Array} Returns the new array of filtered values.
* @example
@@ -7877,12 +8084,12 @@
* _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
* // => [{ 'x': 2 }]
*/
- var xorBy = rest(function(arrays) {
+ var xorBy = baseRest(function(arrays) {
var iteratee = last(arrays);
if (isArrayLikeObject(iteratee)) {
iteratee = undefined;
}
- return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee));
+ return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
});
/**
@@ -7905,7 +8112,7 @@
* _.xorWith(objects, others, _.isEqual);
* // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
*/
- var xorWith = rest(function(arrays) {
+ var xorWith = baseRest(function(arrays) {
var comparator = last(arrays);
if (isArrayLikeObject(comparator)) {
comparator = undefined;
@@ -7926,10 +8133,10 @@
* @returns {Array} Returns the new array of grouped elements.
* @example
*
- * _.zip(['fred', 'barney'], [30, 40], [true, false]);
- * // => [['fred', 30, true], ['barney', 40, false]]
+ * _.zip(['a', 'b'], [1, 2], [true, false]);
+ * // => [['a', 1, true], ['b', 2, false]]
*/
- var zip = rest(unzip);
+ var zip = baseRest(unzip);
/**
* This method is like `_.fromPairs` except that it accepts two arrays,
@@ -7989,7 +8196,7 @@
* });
* // => [111, 222]
*/
- var zipWith = rest(function(arrays) {
+ var zipWith = baseRest(function(arrays) {
var length = arrays.length,
iteratee = length > 1 ? arrays[length - 1] : undefined;
@@ -8105,7 +8312,7 @@
* _(object).at(['a[0].b.c', 'a[1]']).value();
* // => [3, 4]
*/
- var wrapperAt = rest(function(paths) {
+ var wrapperAt = baseRest(function(paths) {
paths = baseFlatten(paths, 1);
var length = paths.length,
start = length ? paths[0] : 0,
@@ -8358,7 +8565,7 @@
* @since 0.5.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee to transform keys.
* @returns {Object} Returns the composed aggregate object.
* @example
@@ -8384,7 +8591,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
* @returns {boolean} Returns `true` if all elements pass the predicate check,
@@ -8424,12 +8631,14 @@
* `predicate` returns truthy for. The predicate is invoked with three
* arguments: (value, index|key, collection).
*
+ * **Note:** Unlike `_.remove`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new filtered array.
* @see _.reject
@@ -8470,7 +8679,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=0] The index to search from.
* @returns {*} Returns the matched element, else `undefined`.
@@ -8508,7 +8717,7 @@
* @since 2.0.0
* @category Collection
* @param {Array|Object} collection The collection to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @param {number} [fromIndex=collection.length-1] The index to search from.
* @returns {*} Returns the matched element, else `undefined`.
@@ -8531,7 +8740,7 @@
* @since 4.0.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new flattened array.
* @example
@@ -8556,7 +8765,7 @@
* @since 4.7.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new flattened array.
* @example
@@ -8581,7 +8790,7 @@
* @since 4.7.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The function invoked per iteration.
* @param {number} [depth=1] The maximum recursion depth.
* @returns {Array} Returns the new flattened array.
@@ -8671,7 +8880,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee to transform keys.
* @returns {Object} Returns the composed aggregate object.
* @example
@@ -8715,10 +8924,10 @@
* _.includes([1, 2, 3], 1, 2);
* // => false
*
- * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');
+ * _.includes({ 'a': 1, 'b': 2 }, 1);
* // => true
*
- * _.includes('pebbles', 'eb');
+ * _.includes('abcd', 'bc');
* // => true
*/
function includes(collection, value, fromIndex, guard) {
@@ -8737,8 +8946,8 @@
/**
* Invokes the method at `path` of each element in `collection`, returning
* an array of the results of each invoked method. Any additional arguments
- * are provided to each invoked method. If `methodName` is a function, it's
- * invoked for and `this` bound to, each element in `collection`.
+ * are provided to each invoked method. If `path` is a function, it's invoked
+ * for, and `this` bound to, each element in `collection`.
*
* @static
* @memberOf _
@@ -8757,7 +8966,7 @@
* _.invokeMap([123, 456], String.prototype.split, '');
* // => [['1', '2', '3'], ['4', '5', '6']]
*/
- var invokeMap = rest(function(collection, path, args) {
+ var invokeMap = baseRest(function(collection, path, args) {
var index = -1,
isFunc = typeof path == 'function',
isProp = isKey(path),
@@ -8781,7 +8990,7 @@
* @since 4.0.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee to transform keys.
* @returns {Object} Returns the composed aggregate object.
* @example
@@ -8822,8 +9031,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
* @example
*
@@ -8905,8 +9113,7 @@
* @since 3.0.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {Array} Returns the array of grouped elements.
* @example
*
@@ -9017,8 +9224,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {Array} Returns the new filtered array.
* @see _.filter
* @example
@@ -9045,10 +9251,7 @@
*/
function reject(collection, predicate) {
var func = isArray(collection) ? arrayFilter : baseFilter;
- predicate = getIteratee(predicate, 3);
- return func(collection, function(value, index, collection) {
- return !predicate(value, index, collection);
- });
+ return func(collection, negate(getIteratee(predicate, 3)));
}
/**
@@ -9181,8 +9384,7 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
* @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
@@ -9227,8 +9429,8 @@
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [iteratees=[_.identity]] The iteratees to sort by.
+ * @param {...(Function|Function[])} [iteratees=[_.identity]]
+ * The iteratees to sort by.
* @returns {Array} Returns the new sorted array.
* @example
*
@@ -9250,7 +9452,7 @@
* });
* // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
*/
- var sortBy = rest(function(collection, iteratees) {
+ var sortBy = baseRest(function(collection, iteratees) {
if (collection == null) {
return [];
}
@@ -9260,11 +9462,7 @@
} else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
iteratees = [iteratees[0]];
}
- iteratees = (iteratees.length == 1 && isArray(iteratees[0]))
- ? iteratees[0]
- : baseFlatten(iteratees, 1, isFlattenableIteratee);
-
- return baseOrderBy(collection, iteratees, []);
+ return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
});
/*------------------------------------------------------------------------*/
@@ -9347,7 +9545,7 @@
function ary(func, n, guard) {
n = guard ? undefined : n;
n = (func && n == null) ? func.length : n;
- return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
+ return createWrap(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
}
/**
@@ -9365,7 +9563,7 @@
* @example
*
* jQuery(element).on('click', _.before(5, addContactToList));
- * // => allows adding up to 4 contacts to the list
+ * // => Allows adding up to 4 contacts to the list.
*/
function before(n, func) {
var result;
@@ -9404,9 +9602,9 @@
* @returns {Function} Returns the new bound function.
* @example
*
- * var greet = function(greeting, punctuation) {
+ * function greet(greeting, punctuation) {
* return greeting + ' ' + this.user + punctuation;
- * };
+ * }
*
* var object = { 'user': 'fred' };
*
@@ -9419,13 +9617,13 @@
* bound('hi');
* // => 'hi fred!'
*/
- var bind = rest(function(func, thisArg, partials) {
+ var bind = baseRest(function(func, thisArg, partials) {
var bitmask = BIND_FLAG;
if (partials.length) {
var holders = replaceHolders(partials, getHolder(bind));
bitmask |= PARTIAL_FLAG;
}
- return createWrapper(func, bitmask, thisArg, partials, holders);
+ return createWrap(func, bitmask, thisArg, partials, holders);
});
/**
@@ -9473,13 +9671,13 @@
* bound('hi');
* // => 'hiya fred!'
*/
- var bindKey = rest(function(object, key, partials) {
+ var bindKey = baseRest(function(object, key, partials) {
var bitmask = BIND_FLAG | BIND_KEY_FLAG;
if (partials.length) {
var holders = replaceHolders(partials, getHolder(bindKey));
bitmask |= PARTIAL_FLAG;
}
- return createWrapper(key, bitmask, object, partials, holders);
+ return createWrap(key, bitmask, object, partials, holders);
});
/**
@@ -9525,7 +9723,7 @@
*/
function curry(func, arity, guard) {
arity = guard ? undefined : arity;
- var result = createWrapper(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
+ var result = createWrap(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
result.placeholder = curry.placeholder;
return result;
}
@@ -9570,7 +9768,7 @@
*/
function curryRight(func, arity, guard) {
arity = guard ? undefined : arity;
- var result = createWrapper(func, CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
+ var result = createWrap(func, CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
result.placeholder = curryRight.placeholder;
return result;
}
@@ -9708,6 +9906,9 @@
}
function cancel() {
+ if (timerId !== undefined) {
+ clearTimeout(timerId);
+ }
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined;
}
@@ -9762,7 +9963,7 @@
* }, 'deferred');
* // => Logs 'deferred' after one or more milliseconds.
*/
- var defer = rest(function(func, args) {
+ var defer = baseRest(function(func, args) {
return baseDelay(func, 1, args);
});
@@ -9785,7 +9986,7 @@
* }, 1000, 'later');
* // => Logs 'later' after one second.
*/
- var delay = rest(function(func, wait, args) {
+ var delay = baseRest(function(func, wait, args) {
return baseDelay(func, toNumber(wait) || 0, args);
});
@@ -9808,7 +10009,7 @@
* // => ['d', 'c', 'b', 'a']
*/
function flip(func) {
- return createWrapper(func, FLIP_FLAG);
+ return createWrap(func, FLIP_FLAG);
}
/**
@@ -9903,7 +10104,14 @@
throw new TypeError(FUNC_ERROR_TEXT);
}
return function() {
- return !predicate.apply(this, arguments);
+ var args = arguments;
+ switch (args.length) {
+ case 0: return !predicate.call(this);
+ case 1: return !predicate.call(this, args[0]);
+ case 2: return !predicate.call(this, args[0], args[1]);
+ case 3: return !predicate.call(this, args[0], args[1], args[2]);
+ }
+ return !predicate.apply(this, args);
};
}
@@ -9923,23 +10131,22 @@
* var initialize = _.once(createApplication);
* initialize();
* initialize();
- * // `initialize` invokes `createApplication` once
+ * // => `createApplication` is invoked once
*/
function once(func) {
return before(2, func);
}
/**
- * Creates a function that invokes `func` with arguments transformed by
- * corresponding `transforms`.
+ * Creates a function that invokes `func` with its arguments transformed.
*
* @static
* @since 4.0.0
* @memberOf _
* @category Function
* @param {Function} func The function to wrap.
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [transforms[_.identity]] The functions to transform.
+ * @param {...(Function|Function[])} [transforms=[_.identity]]
+ * The argument transforms.
* @returns {Function} Returns the new function.
* @example
*
@@ -9961,13 +10168,13 @@
* func(10, 5);
* // => [100, 10]
*/
- var overArgs = rest(function(func, transforms) {
+ var overArgs = baseRest(function(func, transforms) {
transforms = (transforms.length == 1 && isArray(transforms[0]))
? arrayMap(transforms[0], baseUnary(getIteratee()))
- : arrayMap(baseFlatten(transforms, 1, isFlattenableIteratee), baseUnary(getIteratee()));
+ : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
var funcsLength = transforms.length;
- return rest(function(args) {
+ return baseRest(function(args) {
var index = -1,
length = nativeMin(args.length, funcsLength);
@@ -9998,9 +10205,9 @@
* @returns {Function} Returns the new partially applied function.
* @example
*
- * var greet = function(greeting, name) {
+ * function greet(greeting, name) {
* return greeting + ' ' + name;
- * };
+ * }
*
* var sayHelloTo = _.partial(greet, 'hello');
* sayHelloTo('fred');
@@ -10011,9 +10218,9 @@
* greetFred('hi');
* // => 'hi fred'
*/
- var partial = rest(function(func, partials) {
+ var partial = baseRest(function(func, partials) {
var holders = replaceHolders(partials, getHolder(partial));
- return createWrapper(func, PARTIAL_FLAG, undefined, partials, holders);
+ return createWrap(func, PARTIAL_FLAG, undefined, partials, holders);
});
/**
@@ -10035,9 +10242,9 @@
* @returns {Function} Returns the new partially applied function.
* @example
*
- * var greet = function(greeting, name) {
+ * function greet(greeting, name) {
* return greeting + ' ' + name;
- * };
+ * }
*
* var greetFred = _.partialRight(greet, 'fred');
* greetFred('hi');
@@ -10048,9 +10255,9 @@
* sayHelloTo('fred');
* // => 'hello fred'
*/
- var partialRight = rest(function(func, partials) {
+ var partialRight = baseRest(function(func, partials) {
var holders = replaceHolders(partials, getHolder(partialRight));
- return createWrapper(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders);
+ return createWrap(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders);
});
/**
@@ -10075,8 +10282,8 @@
* rearged('b', 'c', 'a')
* // => ['a', 'b', 'c']
*/
- var rearg = rest(function(func, indexes) {
- return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes, 1));
+ var rearg = baseRest(function(func, indexes) {
+ return createWrap(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes, 1));
});
/**
@@ -10108,29 +10315,8 @@
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
- start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);
- return function() {
- var args = arguments,
- index = -1,
- length = nativeMax(args.length - start, 0),
- array = Array(length);
-
- while (++index < length) {
- array[index] = args[start + index];
- }
- switch (start) {
- case 0: return func.call(this, array);
- case 1: return func.call(this, args[0], array);
- case 2: return func.call(this, args[0], args[1], array);
- }
- var otherArgs = Array(start + 1);
- index = -1;
- while (++index < start) {
- otherArgs[index] = args[index];
- }
- otherArgs[start] = array;
- return apply(func, this, otherArgs);
- };
+ start = start === undefined ? start : toInteger(start);
+ return baseRest(func, start);
}
/**
@@ -10172,7 +10358,7 @@
throw new TypeError(FUNC_ERROR_TEXT);
}
start = start === undefined ? 0 : nativeMax(toInteger(start), 0);
- return rest(function(args) {
+ return baseRest(function(args) {
var array = args[start],
otherArgs = castSlice(args, 0, start);
@@ -10262,10 +10448,10 @@
}
/**
- * Creates a function that provides `value` to the wrapper function as its
- * first argument. Any additional arguments provided to the function are
- * appended to those provided to the wrapper function. The wrapper is invoked
- * with the `this` binding of the created function.
+ * Creates a function that provides `value` to `wrapper` as its first
+ * argument. Any additional arguments provided to the function are appended
+ * to those provided to the `wrapper`. The wrapper is invoked with the `this`
+ * binding of the created function.
*
* @static
* @memberOf _
@@ -10450,6 +10636,32 @@
return baseClone(value, true, true, customizer);
}
+ /**
+ * Checks if `object` conforms to `source` by invoking the predicate properties
+ * of `source` with the corresponding property values of `object`. This method
+ * is equivalent to a `_.conforms` function when `source` is partially applied.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.14.0
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ *
+ * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
+ * // => true
+ *
+ * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
+ * // => false
+ */
+ function conformsTo(object, source) {
+ return source == null || baseConformsTo(object, source, keys(source));
+ }
+
/**
* Performs a
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
@@ -10464,8 +10676,8 @@
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
- * var object = { 'user': 'fred' };
- * var other = { 'user': 'fred' };
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
*
* _.eq(object, object);
* // => true
@@ -10546,7 +10758,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
* else `false`.
* @example
*
@@ -10568,11 +10780,9 @@
* @static
* @memberOf _
* @since 0.1.0
- * @type {Function}
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
@@ -10597,8 +10807,7 @@
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
* @example
*
* _.isArrayBuffer(new ArrayBuffer(2));
@@ -10607,9 +10816,7 @@
* _.isArrayBuffer(new Array(2));
* // => false
*/
- function isArrayBuffer(value) {
- return isObjectLike(value) && objectToString.call(value) == arrayBufferTag;
- }
+ var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
/**
* Checks if `value` is array-like. A value is considered array-like if it's
@@ -10677,8 +10884,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
* @example
*
* _.isBoolean(false);
@@ -10709,9 +10915,7 @@
* _.isBuffer(new Uint8Array(2));
* // => false
*/
- var isBuffer = !Buffer ? stubFalse : function(value) {
- return value instanceof Buffer;
- };
+ var isBuffer = nativeIsBuffer || stubFalse;
/**
* Checks if `value` is classified as a `Date` object.
@@ -10721,8 +10925,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
* @example
*
* _.isDate(new Date);
@@ -10731,9 +10934,7 @@
* _.isDate('Mon April 23 2012');
* // => false
*/
- function isDate(value) {
- return isObjectLike(value) && objectToString.call(value) == dateTag;
- }
+ var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
/**
* Checks if `value` is likely a DOM element.
@@ -10830,8 +11031,8 @@
* else `false`.
* @example
*
- * var object = { 'user': 'fred' };
- * var other = { 'user': 'fred' };
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
*
* _.isEqual(object, other);
* // => true
@@ -10948,8 +11149,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
@@ -11094,8 +11294,7 @@
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
* @example
*
* _.isMap(new Map);
@@ -11104,9 +11303,7 @@
* _.isMap(new WeakMap);
* // => false
*/
- function isMap(value) {
- return isObjectLike(value) && getTag(value) == mapTag;
- }
+ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
/**
* Performs a partial deep comparison between `object` and `source` to
@@ -11124,12 +11321,12 @@
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
* @example
*
- * var object = { 'user': 'fred', 'age': 40 };
+ * var object = { 'a': 1, 'b': 2 };
*
- * _.isMatch(object, { 'age': 40 });
+ * _.isMatch(object, { 'b': 2 });
* // => true
*
- * _.isMatch(object, { 'age': 36 });
+ * _.isMatch(object, { 'b': 1 });
* // => false
*/
function isMatch(object, source) {
@@ -11211,13 +11408,13 @@
/**
* Checks if `value` is a pristine native function.
*
- * **Note:** This method can't reliably detect native functions in the
- * presence of the `core-js` package because `core-js` circumvents this kind
- * of detection. Despite multiple requests, the `core-js` maintainer has made
- * it clear: any attempt to fix the detection will be obstructed. As a result,
- * we're left with little choice but to throw an error. Unfortunately, this
- * also affects packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
- * which rely on `core-js`.
+ * **Note:** This method can't reliably detect native functions in the presence
+ * of the core-js package because core-js circumvents this kind of detection.
+ * Despite multiple requests, the core-js maintainer has made it clear: any
+ * attempt to fix the detection will be obstructed. As a result, we're left
+ * with little choice but to throw an error. Unfortunately, this also affects
+ * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
+ * which rely on core-js.
*
* @static
* @memberOf _
@@ -11236,7 +11433,7 @@
*/
function isNative(value) {
if (isMaskable(value)) {
- throw new Error('This method is not supported with `core-js`. Try https://github.com/es-shims.');
+ throw new Error('This method is not supported with core-js. Try https://github.com/es-shims.');
}
return baseIsNative(value);
}
@@ -11297,8 +11494,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a number, else `false`.
* @example
*
* _.isNumber(3);
@@ -11369,8 +11565,7 @@
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
* @example
*
* _.isRegExp(/abc/);
@@ -11379,9 +11574,7 @@
* _.isRegExp('/abc/');
* // => false
*/
- function isRegExp(value) {
- return isObject(value) && objectToString.call(value) == regexpTag;
- }
+ var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
/**
* Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
@@ -11423,8 +11616,7 @@
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
* @example
*
* _.isSet(new Set);
@@ -11433,9 +11625,7 @@
* _.isSet(new WeakSet);
* // => false
*/
- function isSet(value) {
- return isObjectLike(value) && getTag(value) == setTag;
- }
+ var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
/**
* Checks if `value` is classified as a `String` primitive or object.
@@ -11445,8 +11635,7 @@
* @memberOf _
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a string, else `false`.
* @example
*
* _.isString('abc');
@@ -11468,8 +11657,7 @@
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
@@ -11491,8 +11679,7 @@
* @since 3.0.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
* @example
*
* _.isTypedArray(new Uint8Array);
@@ -11501,10 +11688,7 @@
* _.isTypedArray([]);
* // => false
*/
- function isTypedArray(value) {
- return isObjectLike(value) &&
- isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
- }
+ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
/**
* Checks if `value` is `undefined`.
@@ -11535,8 +11719,7 @@
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
* @example
*
* _.isWeakMap(new WeakMap);
@@ -11557,8 +11740,7 @@
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified,
- * else `false`.
+ * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
* @example
*
* _.isWeakSet(new WeakSet);
@@ -11907,18 +12089,18 @@
* @example
*
* function Foo() {
- * this.c = 3;
+ * this.a = 1;
* }
*
* function Bar() {
- * this.e = 5;
+ * this.c = 3;
* }
*
- * Foo.prototype.d = 4;
- * Bar.prototype.f = 6;
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
*
- * _.assign({ 'a': 1 }, new Foo, new Bar);
- * // => { 'a': 1, 'c': 3, 'e': 5 }
+ * _.assign({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'c': 3 }
*/
var assign = createAssigner(function(object, source) {
if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {
@@ -11950,18 +12132,18 @@
* @example
*
* function Foo() {
- * this.b = 2;
+ * this.a = 1;
* }
*
* function Bar() {
- * this.d = 4;
+ * this.c = 3;
* }
*
- * Foo.prototype.c = 3;
- * Bar.prototype.e = 5;
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
*
- * _.assignIn({ 'a': 1 }, new Foo, new Bar);
- * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5 }
+ * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
*/
var assignIn = createAssigner(function(object, source) {
if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {
@@ -12055,7 +12237,7 @@
* _.at(object, ['a[0].b.c', 'a[1]']);
* // => [3, 4]
*/
- var at = rest(function(object, paths) {
+ var at = baseRest(function(object, paths) {
return baseAt(object, baseFlatten(paths, 1));
});
@@ -12116,10 +12298,10 @@
* @see _.defaultsDeep
* @example
*
- * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
- * // => { 'user': 'barney', 'age': 36 }
+ * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
*/
- var defaults = rest(function(args) {
+ var defaults = baseRest(function(args) {
args.push(undefined, assignInDefaults);
return apply(assignInWith, undefined, args);
});
@@ -12140,11 +12322,10 @@
* @see _.defaults
* @example
*
- * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
- * // => { 'user': { 'name': 'barney', 'age': 36 } }
- *
+ * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
+ * // => { 'a': { 'b': 2, 'c': 3 } }
*/
- var defaultsDeep = rest(function(args) {
+ var defaultsDeep = baseRest(function(args) {
args.push(undefined, mergeDefaults);
return apply(mergeWith, undefined, args);
});
@@ -12158,8 +12339,7 @@
* @since 1.1.0
* @category Object
* @param {Object} object The object to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {string|undefined} Returns the key of the matched element,
* else `undefined`.
* @example
@@ -12198,8 +12378,7 @@
* @since 2.0.0
* @category Object
* @param {Object} object The object to search.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {string|undefined} Returns the key of the matched element,
* else `undefined`.
* @example
@@ -12413,7 +12592,7 @@
/**
* Gets the value at `path` of `object`. If the resolved value is
- * `undefined`, the `defaultValue` is used in its place.
+ * `undefined`, the `defaultValue` is returned in its place.
*
* @static
* @memberOf _
@@ -12536,8 +12715,7 @@
* @since 4.1.0
* @category Object
* @param {Object} object The object to invert.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {Object} Returns the new inverted object.
* @example
*
@@ -12577,7 +12755,7 @@
* _.invoke(object, 'a[0].b.c.slice', 1, 3);
* // => [2, 3]
*/
- var invoke = rest(baseInvoke);
+ var invoke = baseRest(baseInvoke);
/**
* Creates an array of the own enumerable property names of `object`.
@@ -12681,8 +12859,7 @@
* @since 3.8.0
* @category Object
* @param {Object} object The object to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Object} Returns the new mapped object.
* @see _.mapValues
* @example
@@ -12713,8 +12890,7 @@
* @since 2.4.0
* @category Object
* @param {Object} object The object to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Object} Returns the new mapped object.
* @see _.mapKeys
* @example
@@ -12761,16 +12937,16 @@
* @returns {Object} Returns `object`.
* @example
*
- * var users = {
- * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
+ * var object = {
+ * 'a': [{ 'b': 2 }, { 'd': 4 }]
* };
*
- * var ages = {
- * 'data': [{ 'age': 36 }, { 'age': 40 }]
+ * var other = {
+ * 'a': [{ 'c': 3 }, { 'e': 5 }]
* };
*
- * _.merge(users, ages);
- * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
+ * _.merge(object, other);
+ * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
*/
var merge = createAssigner(function(object, source, srcIndex) {
baseMerge(object, source, srcIndex);
@@ -12801,18 +12977,11 @@
* }
* }
*
- * var object = {
- * 'fruits': ['apple'],
- * 'vegetables': ['beet']
- * };
- *
- * var other = {
- * 'fruits': ['banana'],
- * 'vegetables': ['carrot']
- * };
+ * var object = { 'a': [1], 'b': [2] };
+ * var other = { 'a': [3], 'b': [4] };
*
* _.mergeWith(object, other, customizer);
- * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
+ * // => { 'a': [1, 3], 'b': [2, 4] }
*/
var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
baseMerge(object, source, srcIndex, customizer);
@@ -12837,7 +13006,7 @@
* _.omit(object, ['a', 'c']);
* // => { 'b': '2' }
*/
- var omit = rest(function(object, props) {
+ var omit = baseRest(function(object, props) {
if (object == null) {
return {};
}
@@ -12856,8 +13025,7 @@
* @since 4.0.0
* @category Object
* @param {Object} object The source object.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per property.
+ * @param {Function} [predicate=_.identity] The function invoked per property.
* @returns {Object} Returns the new object.
* @example
*
@@ -12867,10 +13035,7 @@
* // => { 'b': '2' }
*/
function omitBy(object, predicate) {
- predicate = getIteratee(predicate);
- return basePickBy(object, function(value, key) {
- return !predicate(value, key);
- });
+ return pickBy(object, negate(getIteratee(predicate)));
}
/**
@@ -12890,7 +13055,7 @@
* _.pick(object, ['a', 'c']);
* // => { 'a': 1, 'c': 3 }
*/
- var pick = rest(function(object, props) {
+ var pick = baseRest(function(object, props) {
return object == null ? {} : basePick(object, arrayMap(baseFlatten(props, 1), toKey));
});
@@ -12903,8 +13068,7 @@
* @since 4.0.0
* @category Object
* @param {Object} object The source object.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per property.
+ * @param {Function} [predicate=_.identity] The function invoked per property.
* @returns {Object} Returns the new object.
* @example
*
@@ -12914,7 +13078,7 @@
* // => { 'a': 1, 'c': 3 }
*/
function pickBy(object, predicate) {
- return object == null ? {} : basePickBy(object, getIteratee(predicate));
+ return object == null ? {} : basePickBy(object, getAllKeysIn(object), getIteratee(predicate));
}
/**
@@ -13539,8 +13703,9 @@
? length
: baseClamp(toInteger(position), 0, length);
+ var end = position;
position -= target.length;
- return position >= 0 && string.indexOf(target, position) == position;
+ return position >= 0 && string.slice(position, end) == target;
}
/**
@@ -13988,7 +14153,8 @@
function startsWith(string, target, position) {
string = toString(string);
position = baseClamp(toInteger(position), 0, string.length);
- return string.lastIndexOf(baseToString(target), position) == position;
+ target = baseToString(target);
+ return string.slice(position, position + target.length) == target;
}
/**
@@ -14571,7 +14737,7 @@
* elements = [];
* }
*/
- var attempt = rest(function(func, args) {
+ var attempt = baseRest(function(func, args) {
try {
return apply(func, undefined, args);
} catch (e) {
@@ -14596,16 +14762,16 @@
*
* var view = {
* 'label': 'docs',
- * 'onClick': function() {
+ * 'click': function() {
* console.log('clicked ' + this.label);
* }
* };
*
- * _.bindAll(view, ['onClick']);
- * jQuery(element).on('click', view.onClick);
+ * _.bindAll(view, ['click']);
+ * jQuery(element).on('click', view.click);
* // => Logs 'clicked docs' when clicked.
*/
- var bindAll = rest(function(object, methodNames) {
+ var bindAll = baseRest(function(object, methodNames) {
arrayEach(baseFlatten(methodNames, 1), function(key) {
key = toKey(key);
object[key] = bind(object[key], object);
@@ -14630,7 +14796,7 @@
* var func = _.cond([
* [_.matches({ 'a': 1 }), _.constant('matches A')],
* [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
- * [_.constant(true), _.constant('no match')]
+ * [_.stubTrue, _.constant('no match')]
* ]);
*
* func({ 'a': 1, 'b': 2 });
@@ -14653,7 +14819,7 @@
return [toIteratee(pair[0]), pair[1]];
});
- return rest(function(args) {
+ return baseRest(function(args) {
var index = -1;
while (++index < length) {
var pair = pairs[index];
@@ -14677,13 +14843,13 @@
* @returns {Function} Returns the new spec function.
* @example
*
- * var users = [
- * { 'user': 'barney', 'age': 36 },
- * { 'user': 'fred', 'age': 40 }
+ * var objects = [
+ * { 'a': 2, 'b': 1 },
+ * { 'a': 1, 'b': 2 }
* ];
*
- * _.filter(users, _.conforms({ 'age': function(n) { return n > 38; } }));
- * // => [{ 'user': 'fred', 'age': 40 }]
+ * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
+ * // => [{ 'a': 1, 'b': 2 }]
*/
function conforms(source) {
return baseConforms(baseClone(source, true));
@@ -14714,6 +14880,30 @@
};
}
+ /**
+ * Checks `value` to determine whether a default value should be returned in
+ * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
+ * or `undefined`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.14.0
+ * @category Util
+ * @param {*} value The value to check.
+ * @param {*} defaultValue The default value.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * _.defaultTo(1, 10);
+ * // => 1
+ *
+ * _.defaultTo(undefined, 10);
+ * // => 10
+ */
+ function defaultTo(value, defaultValue) {
+ return (value == null || value !== value) ? defaultValue : value;
+ }
+
/**
* Creates a function that returns the result of invoking the given functions
* with the `this` binding of the created function, where each successive
@@ -14723,7 +14913,7 @@
* @memberOf _
* @since 3.0.0
* @category Util
- * @param {...(Function|Function[])} [funcs] Functions to invoke.
+ * @param {...(Function|Function[])} [funcs] The functions to invoke.
* @returns {Function} Returns the new composite function.
* @see _.flowRight
* @example
@@ -14746,7 +14936,7 @@
* @since 3.0.0
* @memberOf _
* @category Util
- * @param {...(Function|Function[])} [funcs] Functions to invoke.
+ * @param {...(Function|Function[])} [funcs] The functions to invoke.
* @returns {Function} Returns the new composite function.
* @see _.flow
* @example
@@ -14762,7 +14952,7 @@
var flowRight = createFlow(true);
/**
- * This method returns the first argument given to it.
+ * This method returns the first argument it receives.
*
* @static
* @since 0.1.0
@@ -14772,7 +14962,7 @@
* @returns {*} Returns `value`.
* @example
*
- * var object = { 'user': 'fred' };
+ * var object = { 'a': 1 };
*
* console.log(_.identity(object) === object);
* // => true
@@ -14843,13 +15033,13 @@
* @returns {Function} Returns the new spec function.
* @example
*
- * var users = [
- * { 'user': 'barney', 'age': 36, 'active': true },
- * { 'user': 'fred', 'age': 40, 'active': false }
+ * var objects = [
+ * { 'a': 1, 'b': 2, 'c': 3 },
+ * { 'a': 4, 'b': 5, 'c': 6 }
* ];
*
- * _.filter(users, _.matches({ 'age': 40, 'active': false }));
- * // => [{ 'user': 'fred', 'age': 40, 'active': false }]
+ * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
+ * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
*/
function matches(source) {
return baseMatches(baseClone(source, true));
@@ -14871,13 +15061,13 @@
* @returns {Function} Returns the new spec function.
* @example
*
- * var users = [
- * { 'user': 'barney' },
- * { 'user': 'fred' }
+ * var objects = [
+ * { 'a': 1, 'b': 2, 'c': 3 },
+ * { 'a': 4, 'b': 5, 'c': 6 }
* ];
*
- * _.find(users, _.matchesProperty('user', 'fred'));
- * // => { 'user': 'fred' }
+ * _.find(objects, _.matchesProperty('a', 4));
+ * // => { 'a': 4, 'b': 5, 'c': 6 }
*/
function matchesProperty(path, srcValue) {
return baseMatchesProperty(path, baseClone(srcValue, true));
@@ -14907,7 +15097,7 @@
* _.map(objects, _.method(['a', 'b']));
* // => [2, 1]
*/
- var method = rest(function(path, args) {
+ var method = baseRest(function(path, args) {
return function(object) {
return baseInvoke(object, path, args);
};
@@ -14936,7 +15126,7 @@
* _.map([['a', '2'], ['c', '0']], _.methodOf(object));
* // => [2, 0]
*/
- var methodOf = rest(function(object, args) {
+ var methodOf = baseRest(function(object, args) {
return function(path) {
return baseInvoke(object, path, args);
};
@@ -15035,7 +15225,7 @@
}
/**
- * A method that returns `undefined`.
+ * This method returns `undefined`.
*
* @static
* @memberOf _
@@ -15072,7 +15262,7 @@
*/
function nthArg(n) {
n = toInteger(n);
- return rest(function(args) {
+ return baseRest(function(args) {
return baseNth(args, n);
});
}
@@ -15085,8 +15275,8 @@
* @memberOf _
* @since 4.0.0
* @category Util
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [iteratees=[_.identity]] The iteratees to invoke.
+ * @param {...(Function|Function[])} [iteratees=[_.identity]]
+ * The iteratees to invoke.
* @returns {Function} Returns the new function.
* @example
*
@@ -15105,8 +15295,8 @@
* @memberOf _
* @since 4.0.0
* @category Util
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [predicates=[_.identity]] The predicates to check.
+ * @param {...(Function|Function[])} [predicates=[_.identity]]
+ * The predicates to check.
* @returns {Function} Returns the new function.
* @example
*
@@ -15131,8 +15321,8 @@
* @memberOf _
* @since 4.0.0
* @category Util
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [predicates=[_.identity]] The predicates to check.
+ * @param {...(Function|Function[])} [predicates=[_.identity]]
+ * The predicates to check.
* @returns {Function} Returns the new function.
* @example
*
@@ -15284,7 +15474,7 @@
var rangeRight = createRange(true);
/**
- * A method that returns a new empty array.
+ * This method returns a new empty array.
*
* @static
* @memberOf _
@@ -15306,7 +15496,7 @@
}
/**
- * A method that returns `false`.
+ * This method returns `false`.
*
* @static
* @memberOf _
@@ -15323,7 +15513,7 @@
}
/**
- * A method that returns a new empty object.
+ * This method returns a new empty object.
*
* @static
* @memberOf _
@@ -15345,7 +15535,7 @@
}
/**
- * A method that returns an empty string.
+ * This method returns an empty string.
*
* @static
* @memberOf _
@@ -15362,7 +15552,7 @@
}
/**
- * A method that returns `true`.
+ * This method returns `true`.
*
* @static
* @memberOf _
@@ -15480,7 +15670,7 @@
*/
var add = createMathOperation(function(augend, addend) {
return augend + addend;
- });
+ }, 0);
/**
* Computes `number` rounded up to `precision`.
@@ -15522,7 +15712,7 @@
*/
var divide = createMathOperation(function(dividend, divisor) {
return dividend / divisor;
- });
+ }, 1);
/**
* Computes `number` rounded down to `precision`.
@@ -15581,8 +15771,7 @@
* @since 4.0.0
* @category Math
* @param {Array} array The array to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {*} Returns the maximum value.
* @example
*
@@ -15597,7 +15786,7 @@
*/
function maxBy(array, iteratee) {
return (array && array.length)
- ? baseExtremum(array, getIteratee(iteratee), baseGt)
+ ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
: undefined;
}
@@ -15629,8 +15818,7 @@
* @since 4.7.0
* @category Math
* @param {Array} array The array to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {number} Returns the mean.
* @example
*
@@ -15644,7 +15832,7 @@
* // => 5
*/
function meanBy(array, iteratee) {
- return baseMean(array, getIteratee(iteratee));
+ return baseMean(array, getIteratee(iteratee, 2));
}
/**
@@ -15681,8 +15869,7 @@
* @since 4.0.0
* @category Math
* @param {Array} array The array to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {*} Returns the minimum value.
* @example
*
@@ -15697,7 +15884,7 @@
*/
function minBy(array, iteratee) {
return (array && array.length)
- ? baseExtremum(array, getIteratee(iteratee), baseLt)
+ ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
: undefined;
}
@@ -15718,7 +15905,7 @@
*/
var multiply = createMathOperation(function(multiplier, multiplicand) {
return multiplier * multiplicand;
- });
+ }, 1);
/**
* Computes `number` rounded to `precision`.
@@ -15760,7 +15947,7 @@
*/
var subtract = createMathOperation(function(minuend, subtrahend) {
return minuend - subtrahend;
- });
+ }, 0);
/**
* Computes the sum of the values in `array`.
@@ -15792,8 +15979,7 @@
* @since 4.0.0
* @category Math
* @param {Array} array The array to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {number} Returns the sum.
* @example
*
@@ -15808,7 +15994,7 @@
*/
function sumBy(array, iteratee) {
return (array && array.length)
- ? baseSum(array, getIteratee(iteratee))
+ ? baseSum(array, getIteratee(iteratee, 2))
: 0;
}
@@ -15987,7 +16173,9 @@
lodash.cloneDeep = cloneDeep;
lodash.cloneDeepWith = cloneDeepWith;
lodash.cloneWith = cloneWith;
+ lodash.conformsTo = conformsTo;
lodash.deburr = deburr;
+ lodash.defaultTo = defaultTo;
lodash.divide = divide;
lodash.endsWith = endsWith;
lodash.eq = eq;
@@ -16228,7 +16416,7 @@
return this.reverse().find(predicate);
};
- LazyWrapper.prototype.invokeMap = rest(function(path, args) {
+ LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
if (typeof path == 'function') {
return new LazyWrapper(this);
}
@@ -16238,10 +16426,7 @@
});
LazyWrapper.prototype.reject = function(predicate) {
- predicate = getIteratee(predicate, 3);
- return this.filter(function(value) {
- return !predicate(value);
- });
+ return this.filter(negate(getIteratee(predicate)));
};
LazyWrapper.prototype.slice = function(start, end) {
@@ -16345,7 +16530,7 @@
}
});
- realNames[createHybridWrapper(undefined, BIND_KEY_FLAG).name] = [{
+ realNames[createHybrid(undefined, BIND_KEY_FLAG).name] = [{
'name': 'wrapper',
'func': undefined
}];
@@ -16364,6 +16549,9 @@
lodash.prototype.reverse = wrapperReverse;
lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
+ // Add lazy aliases.
+ lodash.prototype.first = lodash.prototype.head;
+
if (iteratorSymbol) {
lodash.prototype[iteratorSymbol] = wrapperToIterator;
}
@@ -16375,22 +16563,21 @@
// Export lodash.
var _ = runInContext();
- // Expose Lodash on the free variable `window` or `self` when available so it's
- // globally accessible, even when bundled with Browserify, Webpack, etc. This
- // also prevents errors in cases where Lodash is loaded by a script tag in the
- // presence of an AMD loader. See http://requirejs.org/docs/errors.html#mismatch
- // for more details. Use `_.noConflict` to remove Lodash from the global object.
- (freeSelf || {})._ = _;
-
- // Some AMD build optimizers like r.js check for condition patterns like the following:
+ // Some AMD build optimizers, like r.js, check for condition patterns like:
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
+ // Expose Lodash on the global object to prevent errors when Lodash is
+ // loaded by a script tag in the presence of an AMD loader.
+ // See http://requirejs.org/docs/errors.html#mismatch for more details.
+ // Use `_.noConflict` to remove Lodash from the global object.
+ root._ = _;
+
// Define as an anonymous module so, through path mapping, it can be
// referenced as the "underscore" module.
define(function() {
return _;
});
}
- // Check for `exports` after `define` in case a build optimizer adds an `exports` object.
+ // Check for `exports` after `define` in case a build optimizer adds it.
else if (freeModule) {
// Export for Node.js.
(freeModule.exports = _)._ = _;
diff --git a/lodash.min.js b/lodash.min.js
index 018b6a766..0d129d44a 100644
--- a/lodash.min.js
+++ b/lodash.min.js
@@ -4,124 +4,127 @@
*/
;(function(){function t(t,n){return t.set(n[0],n[1]),t}function n(t,n){return t.add(n),t}function r(t,n,r){switch(r.length){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}function e(t,n,r,e){for(var u=-1,o=t?t.length:0;++u=t?t:r),n!==T&&(t=t>=n?t:n)),t}function rn(t,n,r,e,o,i,f){var c;if(e&&(c=i?e(t,o,i,f):e(t)),c!==T)return c;if(!Ze(t))return t;if(o=yi(t)){if(c=Kr(t),!n)return lr(t,c)}else{var a=qr(t),l="[object Function]"==a||"[object GeneratorFunction]"==a;if(bi(t))return or(t,n);if("[object Object]"==a||"[object Arguments]"==a||l&&!i){if(C(t))return i?t:{};if(c=Gr(l?{}:t),
-!n)return hr(t,Xt(c,t))}else{if(!Ct[a])return i?t:{};c=Jr(t,a,rn,n)}}if(f||(f=new qt),i=f.get(t))return i;if(f.set(t,c),!o)var s=r?gn(t,iu,Tr):iu(t);return u(s||t,function(u,o){s&&(o=u,u=t[o]),Yt(c,o,rn(u,n,r,e,o,t,f))}),c}function en(t){var n=iu(t),r=n.length;return function(e){if(null==e)return!r;for(var u=r;u--;){var o=n[u],i=t[o],f=e[o];if(f===T&&!(o in Object(e))||!i(f))return false}return true}}function un(t){return Ze(t)?Tu(t):{}}function on(t,n,r){if(typeof t!="function")throw new Au("Expected a function");
-return At(function(){t.apply(T,r)},n)}function fn(t,n,r,e){var u=-1,o=c,i=true,f=t.length,s=[],h=n.length;if(!f)return s;r&&(n=l(n,O(r))),e?(o=a,i=false):n.length>=200&&(o=E,i=false,n=new Zt(n));t:for(;++u0&&r(f)?n>1?sn(f,n-1,r,e,u):s(u,f):e||(u[u.length]=f)}return u}function hn(t,n){return t&&ko(t,n,iu)}function pn(t,n){return t&&Eo(t,n,iu)}function _n(t,n){return f(n,function(n){return Fe(t[n])})}function vn(t,n){n=ne(n,t)?[n]:er(n);for(var r=0,e=n.length;null!=t&&e>r;)t=t[fe(n[r++])];return r&&r==e?t:T}function gn(t,n,r){
-return n=n(t),yi(t)?n:s(n,r(t))}function dn(t,n){return t>n}function yn(t,n){return null!=t&&(Wu.call(t,n)||typeof t=="object"&&n in t&&null===Ju(Object(t)))}function bn(t,n){return null!=t&&n in Object(t)}function xn(t,n,r){for(var e=r?a:c,u=t[0].length,o=t.length,i=o,f=Array(o),s=1/0,h=[];i--;){var p=t[i];i&&n&&(p=l(p,O(n))),s=to(p.length,s),f[i]=!r&&(n||u>=120&&p.length>=120)?new Zt(i&&p):T}var p=t[0],_=-1,v=f[0];t:for(;++_h.length;){var g=p[_],d=n?n(g):g,g=r||0!==g?g:0;if(v?!E(v,d):!e(h,d,r)){
-for(i=o;--i;){var y=f[i];if(y?!E(y,d):!e(t[i],d,r))continue t}v&&v.push(d),h.push(g)}}return h}function jn(t,n,r){var e={};return hn(t,function(t,u,o){n(e,r(t),u,o)}),e}function wn(t,n,e){return ne(n,t)||(n=er(n),t=ie(t,n),n=ve(n)),n=null==t?t:t[fe(n)],null==n?T:r(n,t,e)}function mn(t,n,r,e,u){if(t===n)n=true;else if(null==t||null==n||!Ze(t)&&!Te(n))n=t!==t&&n!==n;else t:{var o=yi(t),i=yi(n),f="[object Array]",c="[object Array]";o||(f=qr(t),f="[object Arguments]"==f?"[object Object]":f),i||(c=qr(n),
-c="[object Arguments]"==c?"[object Object]":c);var a="[object Object]"==f&&!C(t),i="[object Object]"==c&&!C(n);if((c=f==c)&&!a)u||(u=new qt),n=o||Ye(t)?zr(t,n,mn,r,e,u):Ur(t,n,f,mn,r,e,u);else{if(!(2&e)&&(o=a&&Wu.call(t,"__wrapped__"),f=i&&Wu.call(n,"__wrapped__"),o||f)){t=o?t.value():t,n=f?n.value():n,u||(u=new qt),n=mn(t,n,r,e,u);break t}if(c)n:if(u||(u=new qt),o=2&e,f=iu(t),i=f.length,c=iu(n).length,i==c||o){for(a=i;a--;){var l=f[a];if(!(o?l in n:yn(n,l))){n=false;break n}}if(c=u.get(t))n=c==n;else{
-c=true,u.set(t,n);for(var s=o;++at}function In(t,n){var r=-1,e=Ue(t)?Array(t.length):[];
-return Ao(t,function(t,u,o){e[++r]=n(t,u,o)}),e}function Rn(t){var n=Pr(t);return 1==n.length&&n[0][2]?ue(n[0][0],n[0][1]):function(r){return r===t||An(r,t,n)}}function Wn(t,n){return ne(t)&&n===n&&!Ze(n)?ue(fe(t),n):function(r){var e=uu(r,t);return e===T&&e===n?ou(r,t):mn(n,e,T,3)}}function Bn(t,n,r,e,o){if(t!==n){if(!yi(n)&&!Ye(n))var i=fu(n);u(i||n,function(u,f){if(i&&(f=u,u=n[f]),Ze(u)){o||(o=new qt);var c=f,a=o,l=t[c],s=n[c],h=a.get(s);if(h)Jt(t,c,h);else{var h=e?e(l,s,c+"",t,n,a):T,p=h===T;p&&(h=s,
-yi(s)||Ye(s)?yi(l)?h=l:$e(l)?h=lr(l):(p=false,h=rn(s,true)):Ve(s)||ze(s)?ze(l)?h=ru(l):!Ze(l)||r&&Fe(l)?(p=false,h=rn(s,true)):h=l:p=false),a.set(s,h),p&&Bn(h,s,r,e,a),a["delete"](s),Jt(t,c,h)}}else c=e?e(t[f],u,f+"",t,n,o):T,c===T&&(c=u),Jt(t,f,c)})}}function Ln(t,n){var r=t.length;return r?(n+=0>n?r:0,Xr(n,r)?t[n]:T):void 0}function Mn(t,n,r){var e=-1;return n=l(n.length?n:[pu],O(Fr())),t=In(t,function(t){return{a:l(n,function(n){return n(t)}),b:++e,c:t}}),j(t,function(t,n){var e;t:{e=-1;for(var u=t.a,o=n.a,i=u.length,f=r.length;++e=f?c:c*("desc"==r[e]?-1:1);break t}}e=t.b-n.b}return e})}function Cn(t,n){return t=Object(t),h(n,function(n,r){return r in t&&(n[r]=t[r]),n},{})}function zn(t,n){for(var r=-1,e=gn(t,fu,Bo),u=e.length,o={};++rn||n>9007199254740991)return r;do n%2&&(r+=t),(n=Gu(n/2))&&(t+=t);while(n);return r}function Zn(t,n,r,e){n=ne(n,t)?[n]:er(n);for(var u=-1,o=n.length,i=o-1,f=t;null!=f&&++un&&(n=-n>u?0:u+n),r=r>u?u:r,0>r&&(r+=u),u=n>r?0:r-n>>>0,n>>>=0,r=Array(u);++e=u){for(;u>e;){var o=e+u>>>1,i=t[o];null!==i&&!Je(i)&&(r?n>=i:n>i)?e=o+1:u=o}return u}
-return Kn(t,n,pu,r)}function Kn(t,n,r,e){n=r(n);for(var u=0,o=t?t.length:0,i=n!==n,f=null===n,c=Je(n),a=n===T;o>u;){var l=Gu((u+o)/2),s=r(t[l]),h=s!==T,p=null===s,_=s===s,v=Je(s);(i?e||_:a?_&&(e||h):f?_&&h&&(e||!p):c?_&&h&&!p&&(e||!v):p||v?0:e?n>=s:n>s)?u=l+1:o=l}return to(o,4294967294)}function Gn(t,n){for(var r=-1,e=t.length,u=0,o=[];++r=200){if(u=n?null:Io(t))return D(u);i=false,u=E,l=new Zt}else l=n?[]:f;t:for(;++ee?n[e]:T);return i}function rr(t){return $e(t)?t:[]}function er(t){return yi(t)?t:Co(t)}function ur(t,n,r){var e=t.length;return r=r===T?e:r,!n&&r>=e?t:Tn(t,n,r)}function or(t,n){
-if(n)return t.slice();var r=new t.constructor(t.length);return t.copy(r),r}function ir(t){var n=new t.constructor(t.byteLength);return new Fu(n).set(new Fu(t)),n}function fr(t,n){if(t!==n){var r=t!==T,e=null===t,u=t===t,o=Je(t),i=n!==T,f=null===n,c=n===n,a=Je(n);if(!f&&!a&&!o&&t>n||o&&i&&c&&!f&&!a||e&&i&&c||!r&&c||!u)return 1;if(!e&&!o&&!a&&n>t||a&&r&&u&&!e&&!o||f&&r&&u||!i&&u||!c)return-1}return 0}function cr(t,n,r,e){var u=-1,o=t.length,i=r.length,f=-1,c=n.length,a=Xu(o-i,0),l=Array(c+a);for(e=!e;++fu)&&(l[r[u]]=t[u]);for(;a--;)l[f++]=t[u++];return l}function ar(t,n,r,e){var u=-1,o=t.length,i=-1,f=r.length,c=-1,a=n.length,l=Xu(o-f,0),s=Array(l+a);for(e=!e;++uu)&&(s[l+r[i]]=t[u++]);return s}function lr(t,n){var r=-1,e=t.length;for(n||(n=Array(e));++r1?r[u-1]:T,i=u>2?r[2]:T,o=t.length>3&&typeof o=="function"?(u--,o):T;for(i&&te(r[0],r[1],i)&&(o=3>u?T:o,u=1),n=Object(n);++ei&&f[0]!==a&&f[i-1]!==a?[]:$(f,a),
-i-=c.length,e>i?Br(t,n,Ar,u.placeholder,T,f,c,T,T,e-i):r(this&&this!==Kt&&this instanceof u?o:t,this,f)}var o=xr(t);return u}function wr(t){return function(n,r,e){var u=Object(n);if(r=Fr(r,3),!Ue(n))var o=iu(n);return e=t(o||n,function(t,n){return o&&(n=t,t=u[n]),r(t,n,u)},e),e>-1?n[o?o[e]:e]:T}}function mr(t){return Me(function(n){n=sn(n,1);var r=n.length,e=r,u=zt.prototype.thru;for(t&&n.reverse();e--;){var o=n[e];if(typeof o!="function")throw new Au("Expected a function");if(u&&!i&&"wrapper"==$r(o))var i=new zt([],true);
-}for(e=i?e:r;++e=200)return i.plant(e).value();for(var u=0,t=r?n[u].apply(this,t):e;++ud)return j=$(y,j),Br(t,n,Ar,l.placeholder,r,y,j,f,c,a-d);if(j=h?r:this,b=p?j[t]:t,d=y.length,f){x=y.length;for(var w=to(f.length,x),m=lr(y);w--;){var A=f[w];y[w]=Xr(A,x)?m[A]:T}}else v&&d>1&&y.reverse();return s&&d>c&&(y.length=c),this&&this!==Kt&&this instanceof l&&(b=g||xr(b)),b.apply(j,y)}var s=128&n,h=1&n,p=2&n,_=24&n,v=512&n,g=p?T:xr(t);return l}function Or(t,n){return function(r,e){return jn(r,t,n(e))}}function kr(t){return function(n,r){var e;
-if(n===T&&r===T)return 0;if(n!==T&&(e=n),r!==T){if(e===T)return r;typeof n=="string"||typeof r=="string"?(n=Yn(n),r=Yn(r)):(n=Jn(n),r=Jn(r)),e=t(n,r)}return e}}function Er(t){return Me(function(n){return n=1==n.length&&yi(n[0])?l(n[0],O(Fr())):l(sn(n,1,Qr),O(Fr())),Me(function(e){var u=this;return t(n,function(t){return r(t,u,e)})})})}function Sr(t,n){n=n===T?" ":Yn(n);var r=n.length;return 2>r?r?Pn(n,t):n:(r=Pn(n,Ku(t/N(n))),Wt.test(n)?ur(r.match(It),0,t).join(""):r.slice(0,t))}function Ir(t,n,e,u){
-function o(){for(var n=-1,c=arguments.length,a=-1,l=u.length,s=Array(l+c),h=this&&this!==Kt&&this instanceof o?f:t;++an?1:-1:nu(e)||0;var u=-1;r=Xu(Ku((r-n)/(e||1)),0);for(var o=Array(r);r--;)o[t?r:++u]=n,n+=e;return o}}function Wr(t){return function(n,r){return typeof n=="string"&&typeof r=="string"||(n=nu(n),
-r=nu(r)),t(n,r)}}function Br(t,n,r,e,u,o,i,f,c,a){var l=8&n,s=l?i:T;i=l?T:i;var h=l?o:T;return o=l?T:o,n=(n|(l?32:64))&~(l?64:32),4&n||(n&=-4),n=[t,n,u,h,s,o,i,f,c,a],r=r.apply(T,n),re(t)&&Mo(r,n),r.placeholder=e,r}function Lr(t){var n=wu[t];return function(t,r){if(t=nu(t),r=to(Xe(r),292)){var e=(eu(t)+"e").split("e"),e=n(e[0]+"e"+(+e[1]+r)),e=(eu(e)+"e").split("e");return+(e[0]+"e"+(+e[1]-r))}return n(t)}}function Mr(t){return function(n){var r=qr(n);return"[object Map]"==r?U(n):"[object Set]"==r?F(n):A(n,t(n));
-}}function Cr(t,n,r,e,u,o,i,f){var c=2&n;if(!c&&typeof t!="function")throw new Au("Expected a function");var a=e?e.length:0;if(a||(n&=-97,e=u=T),i=i===T?i:Xu(Xe(i),0),f=f===T?f:Xe(f),a-=u?u.length:0,64&n){var l=e,s=u;e=u=T}var h=c?T:Ro(t);return o=[t,n,r,e,u,l,s,o,i,f],h&&(r=o[1],t=h[1],n=r|t,e=128==t&&8==r||128==t&&256==r&&h[8]>=o[7].length||384==t&&h[8]>=h[7].length&&8==r,131>n||e)&&(1&t&&(o[2]=h[2],n|=1&r?0:4),(r=h[3])&&(e=o[3],o[3]=e?cr(e,r,h[4]):r,o[4]=e?$(o[3],"__lodash_placeholder__"):h[4]),
-(r=h[5])&&(e=o[5],o[5]=e?ar(e,r,h[6]):r,o[6]=e?$(o[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(o[7]=r),128&t&&(o[8]=null==o[8]?h[8]:to(o[8],h[8])),null==o[9]&&(o[9]=h[9]),o[0]=h[0],o[1]=n),t=o[0],n=o[1],r=o[2],e=o[3],u=o[4],f=o[9]=null==o[9]?c?0:t.length:Xu(o[9]-a,0),!f&&24&n&&(n&=-25),(h?So:Mo)(n&&1!=n?8==n||16==n?jr(t,n,f):32!=n&&33!=n||u.length?Ar.apply(T,o):Ir(t,n,r,e):dr(t,n,r),o)}function zr(t,n,r,e,u,o){var i=2&u,f=t.length,c=n.length;if(f!=c&&!(i&&c>f))return false;if(c=o.get(t))return c==n;
-var c=-1,a=true,l=1&u?new Zt:T;for(o.set(t,n);++c-1&&0==t%1&&n>t}function te(t,n,r){if(!Ze(r))return false;var e=typeof n;return("number"==e?Ue(r)&&Xr(n,r.length):"string"==e&&n in r)?Ce(r[n],t):false}function ne(t,n){if(yi(t))return false;var r=typeof t;return"number"==r||"symbol"==r||"boolean"==r||null==t||Je(t)?true:ut.test(t)||!et.test(t)||null!=n&&t in Object(n)}function re(t){
-var n=$r(t),r=Ot[n];return typeof r=="function"&&n in Ut.prototype?t===r?true:(n=Ro(r),!!n&&t===n[0]):false}function ee(t){var n=t&&t.constructor;return t===(typeof n=="function"&&n.prototype||ku)}function ue(t,n){return function(r){return null==r?false:r[t]===n&&(n!==T||t in Object(r))}}function oe(t,n,r,e,u,o){return Ze(t)&&Ze(n)&&Bn(t,n,T,oe,o.set(n,t)),t}function ie(t,n){return 1==n.length?t:vn(t,Tn(n,0,-1))}function fe(t){if(typeof t=="string"||Je(t))return t;var n=t+"";return"0"==n&&1/t==-q?"-0":n}function ce(t){
-if(null!=t){try{return Ru.call(t)}catch(n){}return t+""}return""}function ae(t){if(t instanceof Ut)return t.clone();var n=new zt(t.__wrapped__,t.__chain__);return n.__actions__=lr(t.__actions__),n.__index__=t.__index__,n.__values__=t.__values__,n}function le(t,n,r){var e=t?t.length:0;return e?(n=r||n===T?1:Xe(n),Tn(t,0>n?0:n,e)):[]}function se(t,n,r){var e=t?t.length:0;return e?(n=r||n===T?1:Xe(n),n=e-n,Tn(t,0,0>n?0:n)):[]}function he(t,n,r){var e=t?t.length:0;return e?(r=null==r?0:Xe(r),0>r&&(r=Xu(e+r,0)),
-g(t,Fr(n,3),r)):-1}function pe(t,n,r){var e=t?t.length:0;if(!e)return-1;var u=e-1;return r!==T&&(u=Xe(r),u=0>r?Xu(e+u,0):to(u,e-1)),g(t,Fr(n,3),u,true)}function _e(t){return t&&t.length?t[0]:T}function ve(t){var n=t?t.length:0;return n?t[n-1]:T}function ge(t,n){return t&&t.length&&n&&n.length?Dn(t,n):t}function de(t){return t?uo.call(t):t}function ye(t){if(!t||!t.length)return[];var n=0;return t=f(t,function(t){return $e(t)?(n=Xu(t.length,n),true):void 0}),m(n,function(n){return l(t,Un(n))})}function be(t,n){
-if(!t||!t.length)return[];var e=ye(t);return null==n?e:l(e,function(t){return r(n,T,t)})}function xe(t){return t=Ot(t),t.__chain__=true,t}function je(t,n){return n(t)}function we(){return this}function me(t,n){return(yi(t)?u:Ao)(t,Fr(n,3))}function Ae(t,n){return(yi(t)?o:Oo)(t,Fr(n,3))}function Oe(t,n){return(yi(t)?l:In)(t,Fr(n,3))}function ke(t,n,r){var e=-1,u=He(t),o=u.length,i=o-1;for(n=(r?te(t,n,r):n===T)?1:nn(Xe(n),0,o);++e=t&&(n=T),r}}function Re(t,n,r){return n=r?T:n,t=Cr(t,8,T,T,T,T,T,n),t.placeholder=Re.placeholder,t}function We(t,n,r){return n=r?T:n,t=Cr(t,16,T,T,T,T,T,n),t.placeholder=We.placeholder,t}function Be(t,n,r){function e(n){var r=c,e=a;return c=a=T,_=n,s=t.apply(e,r);
-}function u(t){var r=t-p;return t-=_,p===T||r>=n||0>r||g&&t>=l}function o(){var t=Ee();if(u(t))return i(t);var r;r=t-_,t=n-(t-p),r=g?to(t,l-r):t,h=At(o,r)}function i(t){return h=T,d&&c?e(t):(c=a=T,s)}function f(){var t=Ee(),r=u(t);if(c=arguments,a=this,p=t,r){if(h===T)return _=t=p,h=At(o,n),v?e(t):s;if(g)return h=At(o,n),e(p)}return h===T&&(h=At(o,n)),s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof t!="function")throw new Au("Expected a function");return n=nu(n)||0,Ze(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Xu(nu(r.maxWait)||0,n):l,
-d="trailing"in r?!!r.trailing:d),f.cancel=function(){_=0,c=p=a=h=T},f.flush=function(){return h===T?s:i(Ee())},f}function Le(t,n){function r(){var e=arguments,u=n?n.apply(this,e):e[0],o=r.cache;return o.has(u)?o.get(u):(e=t.apply(this,e),r.cache=o.set(u,e),e)}if(typeof t!="function"||n&&typeof n!="function")throw new Au("Expected a function");return r.cache=new(Le.Cache||Pt),r}function Me(t,n){if(typeof t!="function")throw new Au("Expected a function");return n=Xu(n===T?t.length-1:Xe(n),0),function(){
-for(var e=arguments,u=-1,o=Xu(e.length-n,0),i=Array(o);++u-1&&0==t%1&&9007199254740991>=t}function Ze(t){var n=typeof t;return!!t&&("object"==n||"function"==n)}function Te(t){return!!t&&typeof t=="object"}function qe(t){return typeof t=="number"||Te(t)&&"[object Number]"==Mu.call(t);
-}function Ve(t){return!Te(t)||"[object Object]"!=Mu.call(t)||C(t)?false:(t=Ju(Object(t)),null===t?true:(t=Wu.call(t,"constructor")&&t.constructor,typeof t=="function"&&t instanceof t&&Ru.call(t)==Lu))}function Ke(t){return Ze(t)&&"[object RegExp]"==Mu.call(t)}function Ge(t){return typeof t=="string"||!yi(t)&&Te(t)&&"[object String]"==Mu.call(t)}function Je(t){return typeof t=="symbol"||Te(t)&&"[object Symbol]"==Mu.call(t)}function Ye(t){return Te(t)&&Pe(t.length)&&!!Mt[Mu.call(t)]}function He(t){if(!t)return[];
-if(Ue(t))return Ge(t)?t.match(It):lr(t);if(Zu&&t[Zu])return z(t[Zu]());var n=qr(t);return("[object Map]"==n?U:"[object Set]"==n?D:cu)(t)}function Qe(t){return t?(t=nu(t),t===q||t===-q?1.7976931348623157e308*(0>t?-1:1):t===t?t:0):0===t?t:0}function Xe(t){t=Qe(t);var n=t%1;return t===t?n?t-n:t:0}function tu(t){return t?nn(Xe(t),0,4294967295):0}function nu(t){if(typeof t=="number")return t;if(Je(t))return V;if(Ze(t)&&(t=Fe(t.valueOf)?t.valueOf():t,t=Ze(t)?t+"":t),typeof t!="string")return 0===t?t:+t;
-t=t.replace(ct,"");var n=dt.test(t);return n||bt.test(t)?Nt(t.slice(2),n?2:8):gt.test(t)?V:+t}function ru(t){return sr(t,fu(t))}function eu(t){return null==t?"":Yn(t)}function uu(t,n,r){return t=null==t?T:vn(t,n),t===T?r:t}function ou(t,n){return null!=t&&Vr(t,n,bn)}function iu(t){var n=ee(t);if(!n&&!Ue(t))return Qu(Object(t));var r,e=Yr(t),u=!!e,e=e||[],o=e.length;for(r in t)!yn(t,r)||u&&("length"==r||Xr(r,o))||n&&"constructor"==r||e.push(r);return e}function fu(t){for(var n=-1,r=ee(t),e=En(t),u=e.length,o=Yr(t),i=!!o,o=o||[],f=o.length;++nt?false:(t==n.length-1?n.pop():Vu.call(n,t,1),true)},Dt.prototype.get=function(t){
-var n=this.__data__;return t=Ht(n,t),0>t?T:n[t][1]},Dt.prototype.has=function(t){return-1e?r.push([t,n]):r[e][1]=n,this},Pt.prototype.clear=function(){this.__data__={hash:new $t,map:new(fo||Dt),string:new $t}},Pt.prototype["delete"]=function(t){return Nr(this,t)["delete"](t)},Pt.prototype.get=function(t){return Nr(this,t).get(t)},Pt.prototype.has=function(t){return Nr(this,t).has(t)},Pt.prototype.set=function(t,n){
-return Nr(this,t).set(t,n),this},Zt.prototype.add=Zt.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Zt.prototype.has=function(t){return this.__data__.has(t)},qt.prototype.clear=function(){this.__data__=new Dt},qt.prototype["delete"]=function(t){return this.__data__["delete"](t)},qt.prototype.get=function(t){return this.__data__.get(t)},qt.prototype.has=function(t){return this.__data__.has(t)},qt.prototype.set=function(t,n){var r=this.__data__;return r instanceof Dt&&200==r.__data__.length&&(r=this.__data__=new Pt(r.__data__)),
-r.set(t,n),this};var Ao=vr(hn),Oo=vr(pn,true),ko=gr(),Eo=gr(true);Nu&&!qu.call({valueOf:1},"valueOf")&&(En=function(t){return z(Nu(t))});var So=ho?function(t,n){return ho.set(t,n),t}:pu,Io=ao&&1/D(new ao([,-0]))[1]==q?function(t){return new ao(t)}:gu,Ro=ho?function(t){return ho.get(t)}:gu,Wo=Un("length");Pu||(Tr=yu);var Bo=Pu?function(t){for(var n=[];t;)s(n,Tr(t)),t=Ju(Object(t));return n}:Tr;(io&&"[object DataView]"!=qr(new io(new ArrayBuffer(1)))||fo&&"[object Map]"!=qr(new fo)||co&&"[object Promise]"!=qr(co.resolve())||ao&&"[object Set]"!=qr(new ao)||lo&&"[object WeakMap]"!=qr(new lo))&&(qr=function(t){
-var n=Mu.call(t);if(t=(t="[object Object]"==n?t.constructor:T)?ce(t):T)switch(t){case vo:return"[object DataView]";case go:return"[object Map]";case yo:return"[object Promise]";case bo:return"[object Set]";case xo:return"[object WeakMap]"}return n});var Lo=Su?Fe:bu,Mo=function(){var t=0,n=0;return function(r,e){var u=Ee(),o=16-(u-n);if(n=u,o>0){if(150<=++t)return r}else t=0;return So(r,e)}}(),Co=Le(function(t){var n=[];return eu(t).replace(ot,function(t,r,e,u){n.push(e?u.replace(ht,"$1"):r||t)}),
-n}),zo=Me(function(t,n){return $e(t)?fn(t,sn(n,1,$e,true)):[]}),Uo=Me(function(t,n){var r=ve(n);return $e(r)&&(r=T),$e(t)?fn(t,sn(n,1,$e,true),Fr(r)):[]}),$o=Me(function(t,n){var r=ve(n);return $e(r)&&(r=T),$e(t)?fn(t,sn(n,1,$e,true),T,r):[]}),Do=Me(function(t){var n=l(t,rr);return n.length&&n[0]===t[0]?xn(n):[]}),Fo=Me(function(t){var n=ve(t),r=l(t,rr);return n===ve(r)?n=T:r.pop(),r.length&&r[0]===t[0]?xn(r,Fr(n)):[]}),No=Me(function(t){var n=ve(t),r=l(t,rr);return n===ve(r)?n=T:r.pop(),r.length&&r[0]===t[0]?xn(r,T,n):[];
-}),Po=Me(ge),Zo=Me(function(t,n){n=sn(n,1);var r=t?t.length:0,e=tn(t,n);return Fn(t,l(n,function(t){return Xr(t,r)?+t:t}).sort(fr)),e}),To=Me(function(t){return Hn(sn(t,1,$e,true))}),qo=Me(function(t){var n=ve(t);return $e(n)&&(n=T),Hn(sn(t,1,$e,true),Fr(n))}),Vo=Me(function(t){var n=ve(t);return $e(n)&&(n=T),Hn(sn(t,1,$e,true),T,n)}),Ko=Me(function(t,n){return $e(t)?fn(t,n):[]}),Go=Me(function(t){return tr(f(t,$e))}),Jo=Me(function(t){var n=ve(t);return $e(n)&&(n=T),tr(f(t,$e),Fr(n))}),Yo=Me(function(t){
-var n=ve(t);return $e(n)&&(n=T),tr(f(t,$e),T,n)}),Ho=Me(ye),Qo=Me(function(t){var n=t.length,n=n>1?t[n-1]:T,n=typeof n=="function"?(t.pop(),n):T;return be(t,n)}),Xo=Me(function(t){function n(n){return tn(n,t)}t=sn(t,1);var r=t.length,e=r?t[0]:0,u=this.__wrapped__;return!(r>1||this.__actions__.length)&&u instanceof Ut&&Xr(e)?(u=u.slice(e,+e+(r?1:0)),u.__actions__.push({func:je,args:[n],thisArg:T}),new zt(u,this.__chain__).thru(function(t){return r&&!t.length&&t.push(T),t})):this.thru(n)}),ti=pr(function(t,n,r){
-Wu.call(t,r)?++t[r]:t[r]=1}),ni=wr(he),ri=wr(pe),ei=pr(function(t,n,r){Wu.call(t,r)?t[r].push(n):t[r]=[n]}),ui=Me(function(t,n,e){var u=-1,o=typeof n=="function",i=ne(n),f=Ue(t)?Array(t.length):[];return Ao(t,function(t){var c=o?n:i&&null!=t?t[n]:T;f[++u]=c?r(c,t,e):wn(t,n,e)}),f}),oi=pr(function(t,n,r){t[r]=n}),ii=pr(function(t,n,r){t[r?0:1].push(n)},function(){return[[],[]]}),fi=Me(function(t,n){if(null==t)return[];var r=n.length;return r>1&&te(t,n[0],n[1])?n=[]:r>2&&te(n[0],n[1],n[2])&&(n=[n[0]]),
-n=1==n.length&&yi(n[0])?n[0]:sn(n,1,Qr),Mn(t,n,[])}),ci=Me(function(t,n,r){var e=1;if(r.length)var u=$(r,Dr(ci)),e=32|e;return Cr(t,e,n,r,u)}),ai=Me(function(t,n,r){var e=3;if(r.length)var u=$(r,Dr(ai)),e=32|e;return Cr(n,e,t,r,u)}),li=Me(function(t,n){return on(t,1,n)}),si=Me(function(t,n,r){return on(t,nu(n)||0,r)});Le.Cache=Pt;var hi=Me(function(t,n){n=1==n.length&&yi(n[0])?l(n[0],O(Fr())):l(sn(n,1,Qr),O(Fr()));var e=n.length;return Me(function(u){for(var o=-1,i=to(u.length,e);++o=n}),yi=Array.isArray,bi=Uu?function(t){return t instanceof Uu}:bu,xi=Wr(Sn),ji=Wr(function(t,n){return n>=t}),wi=_r(function(t,n){if(po||ee(n)||Ue(n))sr(n,iu(n),t);else for(var r in n)Wu.call(n,r)&&Yt(t,r,n[r])}),mi=_r(function(t,n){if(po||ee(n)||Ue(n))sr(n,fu(n),t);else for(var r in n)Yt(t,r,n[r]);
-}),Ai=_r(function(t,n,r,e){sr(n,fu(n),t,e)}),Oi=_r(function(t,n,r,e){sr(n,iu(n),t,e)}),ki=Me(function(t,n){return tn(t,sn(n,1))}),Ei=Me(function(t){return t.push(T,Vt),r(Ai,T,t)}),Si=Me(function(t){return t.push(T,oe),r(Li,T,t)}),Ii=Or(function(t,n,r){t[n]=r},hu(pu)),Ri=Or(function(t,n,r){Wu.call(t,n)?t[n].push(r):t[n]=[r]},Fr),Wi=Me(wn),Bi=_r(function(t,n,r){Bn(t,n,r)}),Li=_r(function(t,n,r,e){Bn(t,n,r,e)}),Mi=Me(function(t,n){return null==t?{}:(n=l(sn(n,1),fe),Cn(t,fn(gn(t,fu,Bo),n)))}),Ci=Me(function(t,n){
-return null==t?{}:Cn(t,l(sn(n,1),fe))}),zi=Mr(iu),Ui=Mr(fu),$i=br(function(t,n,r){return n=n.toLowerCase(),t+(r?au(n):n)}),Di=br(function(t,n,r){return t+(r?"-":"")+n.toLowerCase()}),Fi=br(function(t,n,r){return t+(r?" ":"")+n.toLowerCase()}),Ni=yr("toLowerCase"),Pi=br(function(t,n,r){return t+(r?"_":"")+n.toLowerCase()}),Zi=br(function(t,n,r){return t+(r?" ":"")+qi(n)}),Ti=br(function(t,n,r){return t+(r?" ":"")+n.toUpperCase()}),qi=yr("toUpperCase"),Vi=Me(function(t,n){try{return r(t,T,n)}catch(e){
-return De(e)?e:new ju(e)}}),Ki=Me(function(t,n){return u(sn(n,1),function(n){n=fe(n),t[n]=ci(t[n],t)}),t}),Gi=mr(),Ji=mr(true),Yi=Me(function(t,n){return function(r){return wn(r,t,n)}}),Hi=Me(function(t,n){return function(r){return wn(t,r,n)}}),Qi=Er(l),Xi=Er(i),tf=Er(_),nf=Rr(),rf=Rr(true),ef=kr(function(t,n){return t+n}),uf=Lr("ceil"),of=kr(function(t,n){return t/n}),ff=Lr("floor"),cf=kr(function(t,n){return t*n}),af=Lr("round"),lf=kr(function(t,n){return t-n});return Ot.after=function(t,n){if(typeof n!="function")throw new Au("Expected a function");
-return t=Xe(t),function(){return 1>--t?n.apply(this,arguments):void 0}},Ot.ary=Se,Ot.assign=wi,Ot.assignIn=mi,Ot.assignInWith=Ai,Ot.assignWith=Oi,Ot.at=ki,Ot.before=Ie,Ot.bind=ci,Ot.bindAll=Ki,Ot.bindKey=ai,Ot.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return yi(t)?t:[t]},Ot.chain=xe,Ot.chunk=function(t,n,r){if(n=(r?te(t,n,r):n===T)?1:Xu(Xe(n),0),r=t?t.length:0,!r||1>n)return[];for(var e=0,u=0,o=Array(Ku(r/n));r>e;)o[u++]=Tn(t,e,e+=n);return o},Ot.compact=function(t){for(var n=-1,r=t?t.length:0,e=0,u=[];++nr&&(r=-r>u?0:u+r),e=e===T||e>u?u:Xe(e),0>e&&(e+=u),e=r>e?0:tu(e);e>r;)t[r++]=n;return t},Ot.filter=function(t,n){return(yi(t)?f:ln)(t,Fr(n,3))},Ot.flatMap=function(t,n){return sn(Oe(t,n),1)},Ot.flatMapDeep=function(t,n){return sn(Oe(t,n),q)},Ot.flatMapDepth=function(t,n,r){return r=r===T?1:Xe(r),sn(Oe(t,n),r)},Ot.flatten=function(t){return t&&t.length?sn(t,1):[]},Ot.flattenDeep=function(t){return t&&t.length?sn(t,q):[]},Ot.flattenDepth=function(t,n){return t&&t.length?(n=n===T?1:Xe(n),sn(t,n)):[];
-},Ot.flip=function(t){return Cr(t,512)},Ot.flow=Gi,Ot.flowRight=Ji,Ot.fromPairs=function(t){for(var n=-1,r=t?t.length:0,e={};++n>>0,r?(t=eu(t))&&(typeof n=="string"||null!=n&&!Ke(n))&&(n=Yn(n),""==n&&Wt.test(t))?ur(t.match(It),0,r):oo.call(t,n,r):[]},Ot.spread=function(t,n){if(typeof t!="function")throw new Au("Expected a function");return n=n===T?0:Xu(Xe(n),0),Me(function(e){var u=e[n];return e=ur(e,0,n),u&&s(e,u),r(t,this,e)})},Ot.tail=function(t){return le(t,1)},Ot.take=function(t,n,r){return t&&t.length?(n=r||n===T?1:Xe(n),
-Tn(t,0,0>n?0:n)):[]},Ot.takeRight=function(t,n,r){var e=t?t.length:0;return e?(n=r||n===T?1:Xe(n),n=e-n,Tn(t,0>n?0:n,e)):[]},Ot.takeRightWhile=function(t,n){return t&&t.length?Qn(t,Fr(n,3),false,true):[]},Ot.takeWhile=function(t,n){return t&&t.length?Qn(t,Fr(n,3)):[]},Ot.tap=function(t,n){return n(t),t},Ot.throttle=function(t,n,r){var e=true,u=true;if(typeof t!="function")throw new Au("Expected a function");return Ze(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Be(t,n,{leading:e,maxWait:n,
-trailing:u})},Ot.thru=je,Ot.toArray=He,Ot.toPairs=zi,Ot.toPairsIn=Ui,Ot.toPath=function(t){return yi(t)?l(t,fe):Je(t)?[t]:lr(Co(t))},Ot.toPlainObject=ru,Ot.transform=function(t,n,r){var e=yi(t)||Ye(t);if(n=Fr(n,4),null==r)if(e||Ze(t)){var o=t.constructor;r=e?yi(t)?new o:[]:Fe(o)?un(Ju(Object(t))):{}}else r={};return(e?u:hn)(t,function(t,e,u){return n(r,t,e,u)}),r},Ot.unary=function(t){return Se(t,1)},Ot.union=To,Ot.unionBy=qo,Ot.unionWith=Vo,Ot.uniq=function(t){return t&&t.length?Hn(t):[]},Ot.uniqBy=function(t,n){
-return t&&t.length?Hn(t,Fr(n)):[]},Ot.uniqWith=function(t,n){return t&&t.length?Hn(t,T,n):[]},Ot.unset=function(t,n){var r;if(null==t)r=true;else{r=t;var e=n,e=ne(e,r)?[e]:er(e);r=ie(r,e),e=fe(ve(e)),r=!(null!=r&&yn(r,e))||delete r[e]}return r},Ot.unzip=ye,Ot.unzipWith=be,Ot.update=function(t,n,r){return null==t?t:Zn(t,n,(typeof r=="function"?r:pu)(vn(t,n)),void 0)},Ot.updateWith=function(t,n,r,e){return e=typeof e=="function"?e:T,null!=t&&(t=Zn(t,n,(typeof r=="function"?r:pu)(vn(t,n)),e)),t},Ot.values=cu,
-Ot.valuesIn=function(t){return null==t?[]:k(t,fu(t))},Ot.without=Ko,Ot.words=su,Ot.wrap=function(t,n){return n=null==n?pu:n,pi(n,t)},Ot.xor=Go,Ot.xorBy=Jo,Ot.xorWith=Yo,Ot.zip=Ho,Ot.zipObject=function(t,n){return nr(t||[],n||[],Yt)},Ot.zipObjectDeep=function(t,n){return nr(t||[],n||[],Zn)},Ot.zipWith=Qo,Ot.entries=zi,Ot.entriesIn=Ui,Ot.extend=mi,Ot.extendWith=Ai,vu(Ot,Ot),Ot.add=ef,Ot.attempt=Vi,Ot.camelCase=$i,Ot.capitalize=au,Ot.ceil=uf,Ot.clamp=function(t,n,r){return r===T&&(r=n,n=T),r!==T&&(r=nu(r),
-r=r===r?r:0),n!==T&&(n=nu(n),n=n===n?n:0),nn(nu(t),n,r)},Ot.clone=function(t){return rn(t,false,true)},Ot.cloneDeep=function(t){return rn(t,true,true)},Ot.cloneDeepWith=function(t,n){return rn(t,true,true,n)},Ot.cloneWith=function(t,n){return rn(t,false,true,n)},Ot.deburr=lu,Ot.divide=of,Ot.endsWith=function(t,n,r){t=eu(t),n=Yn(n);var e=t.length;return r=r===T?e:nn(Xe(r),0,e),r-=n.length,r>=0&&t.indexOf(n,r)==r},Ot.eq=Ce,Ot.escape=function(t){return(t=eu(t))&&X.test(t)?t.replace(H,B):t},Ot.escapeRegExp=function(t){
-return(t=eu(t))&&ft.test(t)?t.replace(it,"\\$&"):t},Ot.every=function(t,n,r){var e=yi(t)?i:cn;return r&&te(t,n,r)&&(n=T),e(t,Fr(n,3))},Ot.find=ni,Ot.findIndex=he,Ot.findKey=function(t,n){return v(t,Fr(n,3),hn)},Ot.findLast=ri,Ot.findLastIndex=pe,Ot.findLastKey=function(t,n){return v(t,Fr(n,3),pn)},Ot.floor=ff,Ot.forEach=me,Ot.forEachRight=Ae,Ot.forIn=function(t,n){return null==t?t:ko(t,Fr(n,3),fu)},Ot.forInRight=function(t,n){return null==t?t:Eo(t,Fr(n,3),fu)},Ot.forOwn=function(t,n){return t&&hn(t,Fr(n,3));
-},Ot.forOwnRight=function(t,n){return t&&pn(t,Fr(n,3))},Ot.get=uu,Ot.gt=gi,Ot.gte=di,Ot.has=function(t,n){return null!=t&&Vr(t,n,yn)},Ot.hasIn=ou,Ot.head=_e,Ot.identity=pu,Ot.includes=function(t,n,r,e){return t=Ue(t)?t:cu(t),r=r&&!e?Xe(r):0,e=t.length,0>r&&(r=Xu(e+r,0)),Ge(t)?e>=r&&-1r&&(r=Xu(e+r,0)),d(t,n,r)):-1},Ot.inRange=function(t,n,r){return n=nu(n)||0,r===T?(r=n,n=0):r=nu(r)||0,t=nu(t),
-t>=to(n,r)&&t=-9007199254740991&&9007199254740991>=t;
-},Ot.isSet=function(t){return Te(t)&&"[object Set]"==qr(t)},Ot.isString=Ge,Ot.isSymbol=Je,Ot.isTypedArray=Ye,Ot.isUndefined=function(t){return t===T},Ot.isWeakMap=function(t){return Te(t)&&"[object WeakMap]"==qr(t)},Ot.isWeakSet=function(t){return Te(t)&&"[object WeakSet]"==Mu.call(t)},Ot.join=function(t,n){return t?Hu.call(t,n):""},Ot.kebabCase=Di,Ot.last=ve,Ot.lastIndexOf=function(t,n,r){var e=t?t.length:0;if(!e)return-1;var u=e;if(r!==T&&(u=Xe(r),u=(0>u?Xu(e+u,0):to(u,e-1))+1),n!==n)return M(t,u-1,true);
-for(;u--;)if(t[u]===n)return u;return-1},Ot.lowerCase=Fi,Ot.lowerFirst=Ni,Ot.lt=xi,Ot.lte=ji,Ot.max=function(t){return t&&t.length?an(t,pu,dn):T},Ot.maxBy=function(t,n){return t&&t.length?an(t,Fr(n),dn):T},Ot.mean=function(t){return b(t,pu)},Ot.meanBy=function(t,n){return b(t,Fr(n))},Ot.min=function(t){return t&&t.length?an(t,pu,Sn):T},Ot.minBy=function(t,n){return t&&t.length?an(t,Fr(n),Sn):T},Ot.stubArray=yu,Ot.stubFalse=bu,Ot.stubObject=function(){return{}},Ot.stubString=function(){return""},Ot.stubTrue=function(){
-return true},Ot.multiply=cf,Ot.nth=function(t,n){return t&&t.length?Ln(t,Xe(n)):T},Ot.noConflict=function(){return Kt._===this&&(Kt._=Cu),this},Ot.noop=gu,Ot.now=Ee,Ot.pad=function(t,n,r){t=eu(t);var e=(n=Xe(n))?N(t):0;return!n||e>=n?t:(n=(n-e)/2,Sr(Gu(n),r)+t+Sr(Ku(n),r))},Ot.padEnd=function(t,n,r){t=eu(t);var e=(n=Xe(n))?N(t):0;return n&&n>e?t+Sr(n-e,r):t},Ot.padStart=function(t,n,r){t=eu(t);var e=(n=Xe(n))?N(t):0;return n&&n>e?Sr(n-e,r)+t:t},Ot.parseInt=function(t,n,r){return r||null==n?n=0:n&&(n=+n),
-t=eu(t).replace(ct,""),no(t,n||(vt.test(t)?16:10))},Ot.random=function(t,n,r){if(r&&typeof r!="boolean"&&te(t,n,r)&&(n=r=T),r===T&&(typeof n=="boolean"?(r=n,n=T):typeof t=="boolean"&&(r=t,t=T)),t===T&&n===T?(t=0,n=1):(t=nu(t)||0,n===T?(n=t,t=0):n=nu(n)||0),t>n){var e=t;t=n,n=e}return r||t%1||n%1?(r=ro(),to(t+r*(n-t+Ft("1e-"+((r+"").length-1))),n)):Nn(t,n)},Ot.reduce=function(t,n,r){var e=yi(t)?h:x,u=3>arguments.length;return e(t,Fr(n,4),r,u,Ao)},Ot.reduceRight=function(t,n,r){var e=yi(t)?p:x,u=3>arguments.length;
-return e(t,Fr(n,4),r,u,Oo)},Ot.repeat=function(t,n,r){return n=(r?te(t,n,r):n===T)?1:Xe(n),Pn(eu(t),n)},Ot.replace=function(){var t=arguments,n=eu(t[0]);return 3>t.length?n:eo.call(n,t[1],t[2])},Ot.result=function(t,n,r){n=ne(n,t)?[n]:er(n);var e=-1,u=n.length;for(u||(t=T,u=1);++e0?t[Nn(0,n-1)]:T},Ot.size=function(t){if(null==t)return 0;
-if(Ue(t)){var n=t.length;return n&&Ge(t)?N(t):n}return Te(t)&&(n=qr(t),"[object Map]"==n||"[object Set]"==n)?t.size:iu(t).length},Ot.snakeCase=Pi,Ot.some=function(t,n,r){var e=yi(t)?_:qn;return r&&te(t,n,r)&&(n=T),e(t,Fr(n,3))},Ot.sortedIndex=function(t,n){return Vn(t,n)},Ot.sortedIndexBy=function(t,n,r){return Kn(t,n,Fr(r))},Ot.sortedIndexOf=function(t,n){var r=t?t.length:0;if(r){var e=Vn(t,n);if(r>e&&Ce(t[e],n))return e}return-1},Ot.sortedLastIndex=function(t,n){return Vn(t,n,true)},Ot.sortedLastIndexBy=function(t,n,r){
-return Kn(t,n,Fr(r),true)},Ot.sortedLastIndexOf=function(t,n){if(t&&t.length){var r=Vn(t,n,true)-1;if(Ce(t[r],n))return r}return-1},Ot.startCase=Zi,Ot.startsWith=function(t,n,r){return t=eu(t),r=nn(Xe(r),0,t.length),t.lastIndexOf(Yn(n),r)==r},Ot.subtract=lf,Ot.sum=function(t){return t&&t.length?w(t,pu):0},Ot.sumBy=function(t,n){return t&&t.length?w(t,Fr(n)):0},Ot.template=function(t,n,r){var e=Ot.templateSettings;r&&te(t,n,r)&&(n=T),t=eu(t),n=Ai({},n,e,Vt),r=Ai({},n.imports,e.imports,Vt);var u,o,i=iu(r),f=k(r,i),c=0;
-r=n.interpolate||wt;var a="__p+='";r=mu((n.escape||wt).source+"|"+r.source+"|"+(r===rt?pt:wt).source+"|"+(n.evaluate||wt).source+"|$","g");var l="sourceURL"in n?"//# sourceURL="+n.sourceURL+"\n":"";if(t.replace(r,function(n,r,e,i,f,l){return e||(e=i),a+=t.slice(c,l).replace(mt,L),r&&(u=true,a+="'+__e("+r+")+'"),f&&(o=true,a+="';"+f+";\n__p+='"),e&&(a+="'+((__t=("+e+"))==null?'':__t)+'"),c=l+n.length,n}),a+="';",(n=n.variable)||(a="with(obj){"+a+"}"),a=(o?a.replace(K,""):a).replace(G,"$1").replace(J,"$1;"),
-a="function("+(n||"obj")+"){"+(n?"":"obj||(obj={});")+"var __t,__p=''"+(u?",__e=_.escape":"")+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+a+"return __p}",n=Vi(function(){return Function(i,l+"return "+a).apply(T,f)}),n.source=a,De(n))throw n;return n},Ot.times=function(t,n){if(t=Xe(t),1>t||t>9007199254740991)return[];var r=4294967295,e=to(t,4294967295);for(n=Fr(n),t-=4294967295,e=m(e,n);++r=o)return t;if(o=r-N(e),1>o)return e;if(r=i?ur(i,0,o).join(""):t.slice(0,o),u===T)return r+e;if(i&&(o+=r.length-o),Ke(u)){if(t.slice(o).search(u)){var f=r;for(u.global||(u=mu(u.source,eu(_t.exec(u))+"g")),
-u.lastIndex=0;i=u.exec(f);)var c=i.index;r=r.slice(0,c===T?o:c)}}else t.indexOf(Yn(u),o)!=o&&(u=r.lastIndexOf(u),u>-1&&(r=r.slice(0,u)));return r+e},Ot.unescape=function(t){return(t=eu(t))&&Q.test(t)?t.replace(Y,P):t},Ot.uniqueId=function(t){var n=++Bu;return eu(t)+n},Ot.upperCase=Ti,Ot.upperFirst=qi,Ot.each=me,Ot.eachRight=Ae,Ot.first=_e,vu(Ot,function(){var t={};return hn(Ot,function(n,r){Wu.call(Ot.prototype,r)||(t[r]=n)}),t}(),{chain:false}),Ot.VERSION="4.13.1",u("bind bindKey curry curryRight partial partialRight".split(" "),function(t){
-Ot[t].placeholder=Ot}),u(["drop","take"],function(t,n){Ut.prototype[t]=function(r){var e=this.__filtered__;if(e&&!n)return new Ut(this);r=r===T?1:Xu(Xe(r),0);var u=this.clone();return e?u.__takeCount__=to(r,u.__takeCount__):u.__views__.push({size:to(r,4294967295),type:t+(0>u.__dir__?"Right":"")}),u},Ut.prototype[t+"Right"]=function(n){return this.reverse()[t](n).reverse()}}),u(["filter","map","takeWhile"],function(t,n){var r=n+1,e=1==r||3==r;Ut.prototype[t]=function(t){var n=this.clone();return n.__iteratees__.push({
-iteratee:Fr(t,3),type:r}),n.__filtered__=n.__filtered__||e,n}}),u(["head","last"],function(t,n){var r="take"+(n?"Right":"");Ut.prototype[t]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(t,n){var r="drop"+(n?"":"Right");Ut.prototype[t]=function(){return this.__filtered__?new Ut(this):this[r](1)}}),Ut.prototype.compact=function(){return this.filter(pu)},Ut.prototype.find=function(t){return this.filter(t).head()},Ut.prototype.findLast=function(t){return this.reverse().find(t);
-},Ut.prototype.invokeMap=Me(function(t,n){return typeof t=="function"?new Ut(this):this.map(function(r){return wn(r,t,n)})}),Ut.prototype.reject=function(t){return t=Fr(t,3),this.filter(function(n){return!t(n)})},Ut.prototype.slice=function(t,n){t=Xe(t);var r=this;return r.__filtered__&&(t>0||0>n)?new Ut(r):(0>t?r=r.takeRight(-t):t&&(r=r.drop(t)),n!==T&&(n=Xe(n),r=0>n?r.dropRight(-n):r.take(n-t)),r)},Ut.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Ut.prototype.toArray=function(){
-return this.take(4294967295)},hn(Ut.prototype,function(t,n){var r=/^(?:filter|find|map|reject)|While$/.test(n),e=/^(?:head|last)$/.test(n),u=Ot[e?"take"+("last"==n?"Right":""):n],o=e||/^find/.test(n);u&&(Ot.prototype[n]=function(){function n(t){return t=u.apply(Ot,s([t],f)),e&&h?t[0]:t}var i=this.__wrapped__,f=e?[1]:arguments,c=i instanceof Ut,a=f[0],l=c||yi(i);l&&r&&typeof a=="function"&&1!=a.length&&(c=l=false);var h=this.__chain__,p=!!this.__actions__.length,a=o&&!h,c=c&&!p;return!o&&l?(i=c?i:new Ut(this),
-i=t.apply(i,f),i.__actions__.push({func:je,args:[n],thisArg:T}),new zt(i,h)):a&&c?t.apply(this,f):(i=this.thru(n),a?e?i.value()[0]:i.value():i)})}),u("pop push shift sort splice unshift".split(" "),function(t){var n=Ou[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",e=/^(?:pop|shift)$/.test(t);Ot.prototype[t]=function(){var t=arguments;if(e&&!this.__chain__){var u=this.value();return n.apply(yi(u)?u:[],t)}return this[r](function(r){return n.apply(yi(r)?r:[],t)})}}),hn(Ut.prototype,function(t,n){
-var r=Ot[n];if(r){var e=r.name+"";(_o[e]||(_o[e]=[])).push({name:n,func:r})}}),_o[Ar(T,2).name]=[{name:"wrapper",func:T}],Ut.prototype.clone=function(){var t=new Ut(this.__wrapped__);return t.__actions__=lr(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=lr(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=lr(this.__views__),t},Ut.prototype.reverse=function(){if(this.__filtered__){var t=new Ut(this);t.__dir__=-1,t.__filtered__=true}else t=this.clone(),
-t.__dir__*=-1;return t},Ut.prototype.value=function(){var t,n=this.__wrapped__.value(),r=this.__dir__,e=yi(n),u=0>r,o=e?n.length:0;t=o;for(var i=this.__views__,f=0,c=-1,a=i.length;++co||o==t&&a==t)return Xn(n,this.__actions__);e=[];
-t:for(;t--&&a>c;){for(u+=r,o=-1,l=n[u];++o=this.__values__.length,n=t?T:this.__values__[this.__index__++];return{done:t,value:n}},Ot.prototype.plant=function(t){
-for(var n,r=this;r instanceof kt;){var e=ae(r);e.__index__=0,e.__values__=T,n?u.__wrapped__=e:n=e;var u=e,r=r.__wrapped__}return u.__wrapped__=t,n},Ot.prototype.reverse=function(){var t=this.__wrapped__;return t instanceof Ut?(this.__actions__.length&&(t=new Ut(this)),t=t.reverse(),t.__actions__.push({func:je,args:[de],thisArg:T}),new zt(t,this.__chain__)):this.thru(de)},Ot.prototype.toJSON=Ot.prototype.valueOf=Ot.prototype.value=function(){return Xn(this.__wrapped__,this.__actions__)},Zu&&(Ot.prototype[Zu]=we),
-Ot}var T,q=1/0,V=NaN,K=/\b__p\+='';/g,G=/\b(__p\+=)''\+/g,J=/(__e\(.*?\)|\b__t\))\+'';/g,Y=/&(?:amp|lt|gt|quot|#39|#96);/g,H=/[&<>"'`]/g,Q=RegExp(Y.source),X=RegExp(H.source),tt=/<%-([\s\S]+?)%>/g,nt=/<%([\s\S]+?)%>/g,rt=/<%=([\s\S]+?)%>/g,et=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ut=/^\w*$/,ot=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(\.|\[\])(?:\4|$))/g,it=/[\\^$.*+?()[\]{}|]/g,ft=RegExp(it.source),ct=/^\s+|\s+$/g,at=/^\s+/,lt=/\s+$/,st=/[a-zA-Z0-9]+/g,ht=/\\(\\)?/g,pt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,_t=/\w*$/,vt=/^0x/i,gt=/^[-+]0x[0-9a-f]+$/i,dt=/^0b[01]+$/i,yt=/^\[object .+?Constructor\]$/,bt=/^0o[0-7]+$/i,xt=/^(?:0|[1-9]\d*)$/,jt=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,wt=/($^)/,mt=/['\n\r\u2028\u2029\\]/g,At="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*",Ot="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+At,kt="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]?|[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",Et=RegExp("['\u2019]","g"),St=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]","g"),It=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+kt+At,"g"),Rt=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d+",Ot].join("|"),"g"),Wt=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ufe0e\\ufe0f]"),Bt=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Lt="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise Reflect RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ isFinite parseInt setTimeout".split(" "),Mt={};
-Mt["[object Float32Array]"]=Mt["[object Float64Array]"]=Mt["[object Int8Array]"]=Mt["[object Int16Array]"]=Mt["[object Int32Array]"]=Mt["[object Uint8Array]"]=Mt["[object Uint8ClampedArray]"]=Mt["[object Uint16Array]"]=Mt["[object Uint32Array]"]=true,Mt["[object Arguments]"]=Mt["[object Array]"]=Mt["[object ArrayBuffer]"]=Mt["[object Boolean]"]=Mt["[object DataView]"]=Mt["[object Date]"]=Mt["[object Error]"]=Mt["[object Function]"]=Mt["[object Map]"]=Mt["[object Number]"]=Mt["[object Object]"]=Mt["[object RegExp]"]=Mt["[object Set]"]=Mt["[object String]"]=Mt["[object WeakMap]"]=false;
-var Ct={};Ct["[object Arguments]"]=Ct["[object Array]"]=Ct["[object ArrayBuffer]"]=Ct["[object DataView]"]=Ct["[object Boolean]"]=Ct["[object Date]"]=Ct["[object Float32Array]"]=Ct["[object Float64Array]"]=Ct["[object Int8Array]"]=Ct["[object Int16Array]"]=Ct["[object Int32Array]"]=Ct["[object Map]"]=Ct["[object Number]"]=Ct["[object Object]"]=Ct["[object RegExp]"]=Ct["[object Set]"]=Ct["[object String]"]=Ct["[object Symbol]"]=Ct["[object Uint8Array]"]=Ct["[object Uint8ClampedArray]"]=Ct["[object Uint16Array]"]=Ct["[object Uint32Array]"]=true,
-Ct["[object Error]"]=Ct["[object Function]"]=Ct["[object WeakMap]"]=false;var zt={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O",
-"\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss"},Ut={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},$t={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},Dt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ft=parseFloat,Nt=parseInt,Pt=typeof exports=="object"&&exports,Zt=Pt&&typeof module=="object"&&module,Tt=Zt&&Zt.exports===Pt,qt=R(typeof self=="object"&&self),Vt=R(typeof this=="object"&&this),Kt=R(typeof global=="object"&&global)||qt||Vt||Function("return this")(),Gt=Z();
-(qt||{})._=Gt,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){return Gt}):Zt?((Zt.exports=Gt)._=Gt,Pt._=Gt):Kt._=Gt}).call(this);
\ No newline at end of file
+var u=-1,o=t?t.length:0;for(e&&o&&(r=t[++u]);++u=n?t:n)),t}function gn(t,n,r,e,o,i,f){var c;if(e&&(c=i?e(t,o,i,f):e(t)),c!==P)return c;if(!fu(t))return t;if(o=Pi(t)){if(c=se(t),!n)return Ir(t,c)}else{var a=Et(t),l="[object Function]"==a||"[object GeneratorFunction]"==a;if(qi(t))return Or(t,n);if("[object Object]"==a||"[object Arguments]"==a||l&&!i){if(C(t))return i?t:{};if(c=he(l?{}:t),
+!n)return Br(t,pn(c,t))}else{if(!Dt[a])return i?t:{};c=pe(t,a,gn,n)}}if(f||(f=new fn),i=f.get(t))return i;if(f.set(t,c),!o)var s=r?In(t,wu,ni):wu(t);return u(s||t,function(u,o){s&&(o=u,u=t[o]),ln(c,o,gn(u,n,r,e,o,t,f))}),r||f.delete(t),c}function dn(t){var n=wu(t);return function(r){return yn(r,t,n)}}function yn(t,n,r){var e=r.length;if(null==t)return!e;for(;e--;){var u=r[e],o=n[u],i=t[u];if(i===P&&!(u in Object(t))||!o(i))return false}return true}function bn(t){return fu(t)?fo(t):{}}function xn(t,n,r){
+if(typeof t!="function")throw new Nu("Expected a function");return St(function(){t.apply(P,r)},n)}function jn(t,n,r,e){var u=-1,o=c,i=true,f=t.length,s=[],h=n.length;if(!f)return s;r&&(n=l(n,S(r))),e?(o=a,i=false):200<=n.length&&(o=I,i=false,n=new Jt(n));t:for(;++un}function Bn(t,n){return null!=t&&(Ju.call(t,n)||typeof t=="object"&&n in t&&null===ti(t))}function Mn(t,n){return null!=t&&n in Object(t)}function Cn(t,n,r){for(var e=r?a:c,u=t[0].length,o=t.length,i=o,f=Uu(o),s=1/0,h=[];i--;){var p=t[i];i&&n&&(p=l(p,S(n))),s=jo(p.length,s),f[i]=!r&&(n||120<=u&&120<=p.length)?new Jt(i&&p):P}var p=t[0],_=-1,v=f[0];t:for(;++_n?r:0,ge(n,r)?t[n]:P}function tr(t,n,r){var e=-1;return n=l(n.length?n:[Iu],S(ie())),t=Jn(t,function(t){return{a:l(n,function(n){return n(t)}),b:++e,c:t}}),A(t,function(t,n){var e;t:{e=-1;for(var u=t.a,o=n.a,i=u.length,f=r.length;++e=f?c:c*("desc"==r[e]?-1:1);break t}}e=t.b-n.b}return e})}function nr(t,n){
+return t=Object(t),rr(t,n,function(n,r){return r in t})}function rr(t,n,r){for(var e=-1,u=n.length,o={};++en||9007199254740991n&&(n=-n>u?0:u+n),r=r>u?u:r,0>r&&(r+=u),u=n>r?0:r-n>>>0,n>>>=0,r=Uu(u);++e=u){for(;e>>1,i=t[o];null!==i&&!hu(i)&&(r?i<=n:i=e?t:lr(t,n,r)}function Or(t,n){
+if(n)return t.slice();var r=new t.constructor(t.length);return t.copy(r),r}function kr(t){var n=new t.constructor(t.byteLength);return new uo(n).set(new uo(t)),n}function Er(t,n){if(t!==n){var r=t!==P,e=null===t,u=t===t,o=hu(t),i=n!==P,f=null===n,c=n===n,a=hu(n);if(!f&&!a&&!o&&t>n||o&&i&&c&&!f&&!a||e&&i&&c||!r&&c||!u)return 1;if(!e&&!o&&!a&&tu?P:o,u=1),n=Object(n);++ei&&f[0]!==a&&f[i-1]!==a?[]:D(f,a),
+i-=c.length,ir?r?fr(n,t):n:(r=fr(n,so(t/T(n))),Ct.test(n)?Ar(r.match(Bt),0,t).join(""):r.slice(0,t))}function Jr(t,n,e,u){
+function o(){for(var n=-1,c=arguments.length,a=-1,l=u.length,s=Uu(l+c),h=this&&this!==qt&&this instanceof o?f:t;++an||e)&&(1&t&&(o[2]=h[2],n|=1&r?0:4),(r=h[3])&&(e=o[3],o[3]=e?Sr(e,r,h[4]):r,o[4]=e?D(o[3],"__lodash_placeholder__"):h[4]),
+(r=h[5])&&(e=o[5],o[5]=e?Rr(e,r,h[6]):r,o[6]=e?D(o[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(o[7]=r),128&t&&(o[8]=null==o[8]?h[8]:jo(o[8],h[8])),null==o[9]&&(o[9]=h[9]),o[0]=h[0],o[1]=n),t=o[0],n=o[1],r=o[2],e=o[3],u=o[4],f=o[9]=null==o[9]?c?0:t.length:xo(o[9]-a,0),!f&&24&n&&(n&=-25),oi((h?Yo:ui)(n&&1!=n?8==n||16==n?Tr(t,n,f):32!=n&&33!=n||u.length?Zr.apply(P,o):Jr(t,n,r,e):Ur(t,n,r),o),t,n)}function re(t,n,r,e,u,o){var i=2&u,f=t.length,c=n.length;if(f!=c&&!(i&&c>f))return false;if((c=o.get(t))&&o.get(n))return c==n;
+var c=-1,a=true,l=1&u?new Jt:P;for(o.set(t,n),o.set(n,t);++cn?0:n,e)):[]}function Re(t,n,r){var e=t?t.length:0;return e?(n=r||n===P?1:vu(n),n=e-n,lr(t,0,0>n?0:n)):[]}function Ie(t,n,r){var e=t?t.length:0;return e?(r=null==r?0:vu(r),
+0>r&&(r=xo(e+r,0)),g(t,ie(n,3),r)):-1}function We(t,n,r){var e=t?t.length:0;if(!e)return-1;var u=e-1;return r!==P&&(u=vu(r),u=0>r?xo(e+u,0):jo(u,e-1)),g(t,ie(n,3),u,true)}function Be(t){return t&&t.length?t[0]:P}function Me(t){var n=t?t.length:0;return n?t[n-1]:P}function Ce(t,n){return t&&t.length&&n&&n.length?ur(t,n):t}function Le(t){return t?Oo.call(t):t}function ze(t){if(!t||!t.length)return[];var n=0;return t=f(t,function(t){if(ru(t))return n=xo(t.length,n),true}),k(n,function(n){return l(t,j(n));
+})}function Ue(t,n){if(!t||!t.length)return[];var e=ze(t);return null==n?e:l(e,function(t){return r(n,P,t)})}function De(t){return t=Rt(t),t.__chain__=true,t}function $e(t,n){return n(t)}function Fe(){return this}function Te(t,n){return(Pi(t)?u:qo)(t,ie(n,3))}function Ne(t,n){return(Pi(t)?o:Vo)(t,ie(n,3))}function Pe(t,n){return(Pi(t)?l:Jn)(t,ie(n,3))}function Ze(t,n,r){var e=-1,u=pu(t),o=u.length,i=o-1;for(n=(r?de(t,n,r):n===P)?1:vn(vu(n),0,o);++e=t&&(n=P),r}}function Ge(t,n,r){return n=r?P:n,t=ne(t,8,P,P,P,P,P,n),t.placeholder=Ge.placeholder,t}function Je(t,n,r){return n=r?P:n,t=ne(t,16,P,P,P,P,P,n),t.placeholder=Je.placeholder,t}function Ye(t,n,r){function e(n){var r=c,e=a;return c=a=P,
+_=n,s=t.apply(e,r)}function u(t){var r=t-p;return t-=_,p===P||r>=n||0>r||g&&t>=l}function o(){var t=qe();if(u(t))return i(t);var r;r=t-_,t=n-(t-p),r=g?jo(t,l-r):t,h=St(o,r)}function i(t){return h=P,d&&c?e(t):(c=a=P,s)}function f(){var t=qe(),r=u(t);if(c=arguments,a=this,p=t,r){if(h===P)return _=t=p,h=St(o,n),v?e(t):s;if(g)return h=St(o,n),e(p)}return h===P&&(h=St(o,n)),s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof t!="function")throw new Nu("Expected a function");return n=du(n)||0,fu(r)&&(v=!!r.leading,
+l=(g="maxWait"in r)?xo(du(r.maxWait)||0,n):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==P&&w.clearTimeout.call(qt,h),_=0,c=p=a=h=P},f.flush=function(){return h===P?s:i(qe())},f}function He(t,n){function r(){var e=arguments,u=n?n.apply(this,e):e[0],o=r.cache;return o.has(u)?o.get(u):(e=t.apply(this,e),r.cache=o.set(u,e),e)}if(typeof t!="function"||n&&typeof n!="function")throw new Nu("Expected a function");return r.cache=new(He.Cache||Kt),r}function Qe(t){if(typeof t!="function")throw new Nu("Expected a function");
+return function(){var n=arguments;switch(n.length){case 0:return!t.call(this);case 1:return!t.call(this,n[0]);case 2:return!t.call(this,n[0],n[1]);case 3:return!t.call(this,n[0],n[1],n[2])}return!t.apply(this,n)}}function Xe(t,n){return t===n||t!==t&&n!==n}function tu(t){return ru(t)&&Ju.call(t,"callee")&&(!co.call(t,"callee")||"[object Arguments]"==Qu.call(t))}function nu(t){return null!=t&&iu(Xo(t))&&!uu(t)}function ru(t){return cu(t)&&nu(t)}function eu(t){return!!cu(t)&&("[object Error]"==Qu.call(t)||typeof t.message=="string"&&typeof t.name=="string");
+}function uu(t){return t=fu(t)?Qu.call(t):"","[object Function]"==t||"[object GeneratorFunction]"==t}function ou(t){return typeof t=="number"&&t==vu(t)}function iu(t){return typeof t=="number"&&-1=t}function fu(t){var n=typeof t;return!!t&&("object"==n||"function"==n)}function cu(t){return!!t&&typeof t=="object"}function au(t){return typeof t=="number"||cu(t)&&"[object Number]"==Qu.call(t)}function lu(t){return!(!cu(t)||"[object Object]"!=Qu.call(t)||C(t))&&(t=ti(t),null===t||(t=Ju.call(t,"constructor")&&t.constructor,
+typeof t=="function"&&t instanceof t&&Gu.call(t)==Hu))}function su(t){return typeof t=="string"||!Pi(t)&&cu(t)&&"[object String]"==Qu.call(t)}function hu(t){return typeof t=="symbol"||cu(t)&&"[object Symbol]"==Qu.call(t)}function pu(t){if(!t)return[];if(nu(t))return su(t)?t.match(Bt):Ir(t);if(io&&t[io])return L(t[io]());var n=Et(t);return("[object Map]"==n?z:"[object Set]"==n?$:Ou)(t)}function _u(t){return t?(t=du(t),t===Z||t===-Z?1.7976931348623157e308*(0>t?-1:1):t===t?t:0):0===t?t:0}function vu(t){
+t=_u(t);var n=t%1;return t===t?n?t-n:t:0}function gu(t){return t?vn(vu(t),0,4294967295):0}function du(t){if(typeof t=="number")return t;if(hu(t))return q;if(fu(t)&&(t=uu(t.valueOf)?t.valueOf():t,t=fu(t)?t+"":t),typeof t!="string")return 0===t?t:+t;t=t.replace(ct,"");var n=xt.test(t);return n||wt.test(t)?Nt(t.slice(2),n?2:8):bt.test(t)?q:+t}function yu(t){return Wr(t,mu(t))}function bu(t){return null==t?"":gr(t)}function xu(t,n,r){return t=null==t?P:Rn(t,n),t===P?r:t}function ju(t,n){return null!=t&&le(t,n,Mn);
+}function wu(t){var n=xe(t);if(!n&&!nu(t))return Jo(t);var r,e=_e(t),u=!!e,e=e||[],o=e.length;for(r in t)!Bn(t,r)||u&&("length"==r||ge(r,o))||n&&"constructor"==r||e.push(r);return e}function mu(t){for(var n=-1,r=xe(t),e=Kn(t),u=e.length,o=_e(t),i=!!o,o=o||[],f=o.length;++nt)&&(t==n.length-1?n.pop():ao.call(n,t,1),true)},Vt.prototype.get=function(t){var n=this.__data__;return t=sn(n,t),0>t?P:n[t][1]},Vt.prototype.has=function(t){return-1e?r.push([t,n]):r[e][1]=n,this},Kt.prototype.clear=function(){this.__data__={hash:new Zt,map:new(So||Vt),string:new Zt}},Kt.prototype.delete=function(t){return fe(this,t).delete(t)},Kt.prototype.get=function(t){return fe(this,t).get(t);
+},Kt.prototype.has=function(t){return fe(this,t).has(t)},Kt.prototype.set=function(t,n){return fe(this,t).set(t,n),this},Jt.prototype.add=Jt.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Jt.prototype.has=function(t){return this.__data__.has(t)},fn.prototype.clear=function(){this.__data__=new Vt},fn.prototype.delete=function(t){return this.__data__.delete(t)},fn.prototype.get=function(t){return this.__data__.get(t)},fn.prototype.has=function(t){return this.__data__.has(t);
+},fn.prototype.set=function(t,n){var r=this.__data__;if(r instanceof Vt){if(r=r.__data__,!So||199>r.length)return r.push([t,n]),this;r=this.__data__=new Kt(r)}return r.set(t,n),this};var qo=Lr(kn),Vo=Lr(En,true),Ko=zr(),Go=zr(true),Jo=U(bo);oo&&!co.call({valueOf:1},"valueOf")&&(Kn=function(t){return L(oo(t))});var Yo=Co?function(t,n){return Co.set(t,n),t}:Iu,Ho=Io&&1/$(new Io([,-0]))[1]==Z?function(t){return new Io(t)}:Mu,Qo=Co?function(t){return Co.get(t)}:Mu,Xo=j("length"),ti=U(po),ni=_o?U(_o):Lu,ri=_o?function(t){
+for(var n=[];t;)s(n,ni(t)),t=ti(t);return n}:ni;(Eo&&"[object DataView]"!=Et(new Eo(new ArrayBuffer(1)))||So&&"[object Map]"!=Et(new So)||Ro&&"[object Promise]"!=Et(Ro.resolve())||Io&&"[object Set]"!=Et(new Io)||Wo&&"[object WeakMap]"!=Et(new Wo))&&(Et=function(t){var n=Qu.call(t);if(t=(t="[object Object]"==n?t.constructor:P)?Oe(t):P)switch(t){case Uo:return"[object DataView]";case Do:return"[object Map]";case $o:return"[object Promise]";case Fo:return"[object Set]";case To:return"[object WeakMap]";
+}return n});var ei=Vu?uu:zu,ui=function(){var t=0,n=0;return function(r,e){var u=qe(),o=16-(u-n);if(n=u,0=n}),Pi=Uu.isArray,Zi=Yt?S(Yt):Un,qi=vo||zu,Vi=Ht?S(Ht):Dn,Ki=Qt?S(Qt):Fn,Gi=Xt?S(Xt):Pn,Ji=tn?S(tn):Zn,Yi=nn?S(nn):qn,Hi=Hr(Gn),Qi=Hr(function(t,n){return t<=n}),Xi=Cr(function(t,n){if(Lo||xe(n)||nu(n))Wr(n,wu(n),t);else for(var r in n)Ju.call(n,r)&&ln(t,r,n[r])}),tf=Cr(function(t,n){
+if(Lo||xe(n)||nu(n))Wr(n,mu(n),t);else for(var r in n)ln(t,r,n[r])}),nf=Cr(function(t,n,r,e){Wr(n,mu(n),t,e)}),rf=Cr(function(t,n,r,e){Wr(n,wu(n),t,e)}),ef=cr(function(t,n){return _n(t,On(n,1))}),uf=cr(function(t){return t.push(P,cn),r(nf,P,t)}),of=cr(function(t){return t.push(P,we),r(sf,P,t)}),ff=qr(function(t,n,r){t[n]=r},Ru(Iu)),cf=qr(function(t,n,r){Ju.call(t,n)?t[n].push(r):t[n]=[r]},ie),af=cr(zn),lf=Cr(function(t,n,r){Qn(t,n,r)}),sf=Cr(function(t,n,r,e){Qn(t,n,r,e)}),hf=cr(function(t,n){return null==t?{}:(n=l(On(n,1),Ae),
+nr(t,jn(In(t,mu,ri),n)))}),pf=cr(function(t,n){return null==t?{}:nr(t,l(On(n,1),Ae))}),_f=te(wu),vf=te(mu),gf=$r(function(t,n,r){return n=n.toLowerCase(),t+(r?ku(n):n)}),df=$r(function(t,n,r){return t+(r?"-":"")+n.toLowerCase()}),yf=$r(function(t,n,r){return t+(r?" ":"")+n.toLowerCase()}),bf=Dr("toLowerCase"),xf=$r(function(t,n,r){return t+(r?"_":"")+n.toLowerCase()}),jf=$r(function(t,n,r){return t+(r?" ":"")+mf(n)}),wf=$r(function(t,n,r){return t+(r?" ":"")+n.toUpperCase()}),mf=Dr("toUpperCase"),Af=cr(function(t,n){
+try{return r(t,P,n)}catch(t){return eu(t)?t:new $u(t)}}),Of=cr(function(t,n){return u(On(n,1),function(n){n=Ae(n),t[n]=Mi(t[n],t)}),t}),kf=Pr(),Ef=Pr(true),Sf=cr(function(t,n){return function(r){return zn(r,t,n)}}),Rf=cr(function(t,n){return function(r){return zn(t,r,n)}}),If=Kr(l),Wf=Kr(i),Bf=Kr(_),Mf=Yr(),Cf=Yr(true),Lf=Vr(function(t,n){return t+n},0),zf=Xr("ceil"),Uf=Vr(function(t,n){return t/n},1),Df=Xr("floor"),$f=Vr(function(t,n){return t*n},1),Ff=Xr("round"),Tf=Vr(function(t,n){return t-n},0);return Rt.after=function(t,n){
+if(typeof n!="function")throw new Nu("Expected a function");return t=vu(t),function(){if(1>--t)return n.apply(this,arguments)}},Rt.ary=Ve,Rt.assign=Xi,Rt.assignIn=tf,Rt.assignInWith=nf,Rt.assignWith=rf,Rt.at=ef,Rt.before=Ke,Rt.bind=Mi,Rt.bindAll=Of,Rt.bindKey=Ci,Rt.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Pi(t)?t:[t]},Rt.chain=De,Rt.chunk=function(t,n,r){if(n=(r?de(t,n,r):n===P)?1:xo(vu(n),0),r=t?t.length:0,!r||1>n)return[];for(var e=0,u=0,o=Uu(so(r/n));er&&(r=-r>u?0:u+r),e=e===P||e>u?u:vu(e),0>e&&(e+=u),e=r>e?0:gu(e);r>>0,r?(t=bu(t))&&(typeof n=="string"||null!=n&&!Gi(n))&&(n=gr(n),""==n&&Ct.test(t))?Ar(t.match(Bt),0,r):ko.call(t,n,r):[]},Rt.spread=function(t,n){if(typeof t!="function")throw new Nu("Expected a function");return n=n===P?0:xo(vu(n),0),cr(function(e){var u=e[n];return e=Ar(e,0,n),u&&s(e,u),r(t,this,e)})},Rt.tail=function(t){return Se(t,1)},Rt.take=function(t,n,r){return t&&t.length?(n=r||n===P?1:vu(n),
+lr(t,0,0>n?0:n)):[]},Rt.takeRight=function(t,n,r){var e=t?t.length:0;return e?(n=r||n===P?1:vu(n),n=e-n,lr(t,0>n?0:n,e)):[]},Rt.takeRightWhile=function(t,n){return t&&t.length?yr(t,ie(n,3),false,true):[]},Rt.takeWhile=function(t,n){return t&&t.length?yr(t,ie(n,3)):[]},Rt.tap=function(t,n){return n(t),t},Rt.throttle=function(t,n,r){var e=true,u=true;if(typeof t!="function")throw new Nu("Expected a function");return fu(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Ye(t,n,{leading:e,maxWait:n,
+trailing:u})},Rt.thru=$e,Rt.toArray=pu,Rt.toPairs=_f,Rt.toPairsIn=vf,Rt.toPath=function(t){return Pi(t)?l(t,Ae):hu(t)?[t]:Ir(ii(t))},Rt.toPlainObject=yu,Rt.transform=function(t,n,r){var e=Pi(t)||Yi(t);if(n=ie(n,4),null==r)if(e||fu(t)){var o=t.constructor;r=e?Pi(t)?new o:[]:uu(o)?bn(ti(t)):{}}else r={};return(e?u:kn)(t,function(t,e,u){return n(r,t,e,u)}),r},Rt.unary=function(t){return Ve(t,1)},Rt.union=vi,Rt.unionBy=gi,Rt.unionWith=di,Rt.uniq=function(t){return t&&t.length?dr(t):[]},Rt.uniqBy=function(t,n){
+return t&&t.length?dr(t,ie(n,2)):[]},Rt.uniqWith=function(t,n){return t&&t.length?dr(t,P,n):[]},Rt.unset=function(t,n){var r;if(null==t)r=true;else{r=t;var e=n,e=ye(e,r)?[e]:mr(e);r=me(r,e),e=Ae(Me(e)),r=!(null!=r&&Bn(r,e))||delete r[e]}return r},Rt.unzip=ze,Rt.unzipWith=Ue,Rt.update=function(t,n,r){return null==t?t:ar(t,n,(typeof r=="function"?r:Iu)(Rn(t,n)),void 0)},Rt.updateWith=function(t,n,r,e){return e=typeof e=="function"?e:P,null!=t&&(t=ar(t,n,(typeof r=="function"?r:Iu)(Rn(t,n)),e)),t},Rt.values=Ou,
+Rt.valuesIn=function(t){return null==t?[]:R(t,mu(t))},Rt.without=yi,Rt.words=Su,Rt.wrap=function(t,n){return n=null==n?Iu:n,Di(n,t)},Rt.xor=bi,Rt.xorBy=xi,Rt.xorWith=ji,Rt.zip=wi,Rt.zipObject=function(t,n){return jr(t||[],n||[],ln)},Rt.zipObjectDeep=function(t,n){return jr(t||[],n||[],ar)},Rt.zipWith=mi,Rt.entries=_f,Rt.entriesIn=vf,Rt.extend=tf,Rt.extendWith=nf,Bu(Rt,Rt),Rt.add=Lf,Rt.attempt=Af,Rt.camelCase=gf,Rt.capitalize=ku,Rt.ceil=zf,Rt.clamp=function(t,n,r){return r===P&&(r=n,n=P),r!==P&&(r=du(r),
+r=r===r?r:0),n!==P&&(n=du(n),n=n===n?n:0),vn(du(t),n,r)},Rt.clone=function(t){return gn(t,false,true)},Rt.cloneDeep=function(t){return gn(t,true,true)},Rt.cloneDeepWith=function(t,n){return gn(t,true,true,n)},Rt.cloneWith=function(t,n){return gn(t,false,true,n)},Rt.conformsTo=function(t,n){return null==n||yn(t,n,wu(n))},Rt.deburr=Eu,Rt.defaultTo=function(t,n){return null==t||t!==t?n:t},Rt.divide=Uf,Rt.endsWith=function(t,n,r){t=bu(t),n=gr(n);var e=t.length,e=r=r===P?e:vn(vu(r),0,e);return r-=n.length,0<=r&&t.slice(r,e)==n;
+},Rt.eq=Xe,Rt.escape=function(t){return(t=bu(t))&&X.test(t)?t.replace(H,en):t},Rt.escapeRegExp=function(t){return(t=bu(t))&&ft.test(t)?t.replace(it,"\\$&"):t},Rt.every=function(t,n,r){var e=Pi(t)?i:wn;return r&&de(t,n,r)&&(n=P),e(t,ie(n,3))},Rt.find=ki,Rt.findIndex=Ie,Rt.findKey=function(t,n){return v(t,ie(n,3),kn)},Rt.findLast=Ei,Rt.findLastIndex=We,Rt.findLastKey=function(t,n){return v(t,ie(n,3),En)},Rt.floor=Df,Rt.forEach=Te,Rt.forEachRight=Ne,Rt.forIn=function(t,n){return null==t?t:Ko(t,ie(n,3),mu);
+},Rt.forInRight=function(t,n){return null==t?t:Go(t,ie(n,3),mu)},Rt.forOwn=function(t,n){return t&&kn(t,ie(n,3))},Rt.forOwnRight=function(t,n){return t&&En(t,ie(n,3))},Rt.get=xu,Rt.gt=Ti,Rt.gte=Ni,Rt.has=function(t,n){return null!=t&&le(t,n,Bn)},Rt.hasIn=ju,Rt.head=Be,Rt.identity=Iu,Rt.includes=function(t,n,r,e){return t=nu(t)?t:Ou(t),r=r&&!e?vu(r):0,e=t.length,0>r&&(r=xo(e+r,0)),su(t)?r<=e&&-1r&&(r=xo(e+r,0)),d(t,n,r)):-1},Rt.inRange=function(t,n,r){return n=du(n)||0,r===P?(r=n,n=0):r=du(r)||0,t=du(t),t>=jo(n,r)&&t=t},Rt.isSet=Ji,Rt.isString=su,
+Rt.isSymbol=hu,Rt.isTypedArray=Yi,Rt.isUndefined=function(t){return t===P},Rt.isWeakMap=function(t){return cu(t)&&"[object WeakMap]"==Et(t)},Rt.isWeakSet=function(t){return cu(t)&&"[object WeakSet]"==Qu.call(t)},Rt.join=function(t,n){return t?yo.call(t,n):""},Rt.kebabCase=df,Rt.last=Me,Rt.lastIndexOf=function(t,n,r){var e=t?t.length:0;if(!e)return-1;var u=e;if(r!==P&&(u=vu(r),u=(0>u?xo(e+u,0):jo(u,e-1))+1),n!==n)return g(t,b,u-1,true);for(;u--;)if(t[u]===n)return u;return-1},Rt.lowerCase=yf,Rt.lowerFirst=bf,
+Rt.lt=Hi,Rt.lte=Qi,Rt.max=function(t){return t&&t.length?mn(t,Iu,Wn):P},Rt.maxBy=function(t,n){return t&&t.length?mn(t,ie(n,2),Wn):P},Rt.mean=function(t){return x(t,Iu)},Rt.meanBy=function(t,n){return x(t,ie(n,2))},Rt.min=function(t){return t&&t.length?mn(t,Iu,Gn):P},Rt.minBy=function(t,n){return t&&t.length?mn(t,ie(n,2),Gn):P},Rt.stubArray=Lu,Rt.stubFalse=zu,Rt.stubObject=function(){return{}},Rt.stubString=function(){return""},Rt.stubTrue=function(){return true},Rt.multiply=$f,Rt.nth=function(t,n){
+return t&&t.length?Xn(t,vu(n)):P},Rt.noConflict=function(){return qt._===this&&(qt._=Xu),this},Rt.noop=Mu,Rt.now=qe,Rt.pad=function(t,n,r){t=bu(t);var e=(n=vu(n))?T(t):0;return!n||e>=n?t:(n=(n-e)/2,Gr(ho(n),r)+t+Gr(so(n),r))},Rt.padEnd=function(t,n,r){t=bu(t);var e=(n=vu(n))?T(t):0;return n&&en){var e=t;t=n,n=e}return r||t%1||n%1?(r=mo(),jo(t+r*(n-t+Tt("1e-"+((r+"").length-1))),n)):ir(t,n)},Rt.reduce=function(t,n,r){var e=Pi(t)?h:m,u=3>arguments.length;return e(t,ie(n,4),r,u,qo)},Rt.reduceRight=function(t,n,r){var e=Pi(t)?p:m,u=3>arguments.length;return e(t,ie(n,4),r,u,Vo)},Rt.repeat=function(t,n,r){
+return n=(r?de(t,n,r):n===P)?1:vu(n),fr(bu(t),n)},Rt.replace=function(){var t=arguments,n=bu(t[0]);return 3>t.length?n:Ao.call(n,t[1],t[2])},Rt.result=function(t,n,r){n=ye(n,t)?[n]:mr(n);var e=-1,u=n.length;for(u||(t=P,u=1);++et||9007199254740991=o)return t;if(o=r-T(e),1>o)return e;if(r=i?Ar(i,0,o).join(""):t.slice(0,o),u===P)return r+e;if(i&&(o+=r.length-o),Gi(u)){if(t.slice(o).search(u)){var f=r;for(u.global||(u=Tu(u.source,bu(dt.exec(u))+"g")),
+u.lastIndex=0;i=u.exec(f);)var c=i.index;r=r.slice(0,c===P?o:c)}}else t.indexOf(gr(u),o)!=o&&(u=r.lastIndexOf(u),-1u.__dir__?"Right":"")}),u},Pt.prototype[t+"Right"]=function(n){return this.reverse()[t](n).reverse()}}),u(["filter","map","takeWhile"],function(t,n){var r=n+1,e=1==r||3==r;Pt.prototype[t]=function(t){var n=this.clone();return n.__iteratees__.push({
+iteratee:ie(t,3),type:r}),n.__filtered__=n.__filtered__||e,n}}),u(["head","last"],function(t,n){var r="take"+(n?"Right":"");Pt.prototype[t]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(t,n){var r="drop"+(n?"":"Right");Pt.prototype[t]=function(){return this.__filtered__?new Pt(this):this[r](1)}}),Pt.prototype.compact=function(){return this.filter(Iu)},Pt.prototype.find=function(t){return this.filter(t).head()},Pt.prototype.findLast=function(t){return this.reverse().find(t);
+},Pt.prototype.invokeMap=cr(function(t,n){return typeof t=="function"?new Pt(this):this.map(function(r){return zn(r,t,n)})}),Pt.prototype.reject=function(t){return this.filter(Qe(ie(t)))},Pt.prototype.slice=function(t,n){t=vu(t);var r=this;return r.__filtered__&&(0n)?new Pt(r):(0>t?r=r.takeRight(-t):t&&(r=r.drop(t)),n!==P&&(n=vu(n),r=0>n?r.dropRight(-n):r.take(n-t)),r)},Pt.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Pt.prototype.toArray=function(){return this.take(4294967295);
+},kn(Pt.prototype,function(t,n){var r=/^(?:filter|find|map|reject)|While$/.test(n),e=/^(?:head|last)$/.test(n),u=Rt[e?"take"+("last"==n?"Right":""):n],o=e||/^find/.test(n);u&&(Rt.prototype[n]=function(){function n(t){return t=u.apply(Rt,s([t],f)),e&&h?t[0]:t}var i=this.__wrapped__,f=e?[1]:arguments,c=i instanceof Pt,a=f[0],l=c||Pi(i);l&&r&&typeof a=="function"&&1!=a.length&&(c=l=false);var h=this.__chain__,p=!!this.__actions__.length,a=o&&!h,c=c&&!p;return!o&&l?(i=c?i:new Pt(this),i=t.apply(i,f),i.__actions__.push({
+func:$e,args:[n],thisArg:P}),new Ft(i,h)):a&&c?t.apply(this,f):(i=this.thru(n),a?e?i.value()[0]:i.value():i)})}),u("pop push shift sort splice unshift".split(" "),function(t){var n=Pu[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",e=/^(?:pop|shift)$/.test(t);Rt.prototype[t]=function(){var t=arguments;if(e&&!this.__chain__){var u=this.value();return n.apply(Pi(u)?u:[],t)}return this[r](function(r){return n.apply(Pi(r)?r:[],t)})}}),kn(Pt.prototype,function(t,n){var r=Rt[n];if(r){var e=r.name+"";
+(zo[e]||(zo[e]=[])).push({name:n,func:r})}}),zo[Zr(P,2).name]=[{name:"wrapper",func:P}],Pt.prototype.clone=function(){var t=new Pt(this.__wrapped__);return t.__actions__=Ir(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Ir(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Ir(this.__views__),t},Pt.prototype.reverse=function(){if(this.__filtered__){var t=new Pt(this);t.__dir__=-1,t.__filtered__=true}else t=this.clone(),t.__dir__*=-1;return t;
+},Pt.prototype.value=function(){var t,n=this.__wrapped__.value(),r=this.__dir__,e=Pi(n),u=0>r,o=e?n.length:0;t=o;for(var i=this.__views__,f=0,c=-1,a=i.length;++co||o==t&&a==t)return br(n,this.__actions__);e=[];t:for(;t--&&c=this.__values__.length,n=t?P:this.__values__[this.__index__++];return{done:t,value:n}},Rt.prototype.plant=function(t){
+for(var n,r=this;r instanceof $t;){var e=Ee(r);e.__index__=0,e.__values__=P,n?u.__wrapped__=e:n=e;var u=e,r=r.__wrapped__}return u.__wrapped__=t,n},Rt.prototype.reverse=function(){var t=this.__wrapped__;return t instanceof Pt?(this.__actions__.length&&(t=new Pt(this)),t=t.reverse(),t.__actions__.push({func:$e,args:[Le],thisArg:P}),new Ft(t,this.__chain__)):this.thru(Le)},Rt.prototype.toJSON=Rt.prototype.valueOf=Rt.prototype.value=function(){return br(this.__wrapped__,this.__actions__)},Rt.prototype.first=Rt.prototype.head,
+io&&(Rt.prototype[io]=Fe),Rt}var P,Z=1/0,q=NaN,V=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],K=/\b__p\+='';/g,G=/\b(__p\+=)''\+/g,J=/(__e\(.*?\)|\b__t\))\+'';/g,Y=/&(?:amp|lt|gt|quot|#39|#96);/g,H=/[&<>"'`]/g,Q=RegExp(Y.source),X=RegExp(H.source),tt=/<%-([\s\S]+?)%>/g,nt=/<%([\s\S]+?)%>/g,rt=/<%=([\s\S]+?)%>/g,et=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ut=/^\w*$/,ot=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(\.|\[\])(?:\4|$))/g,it=/[\\^$.*+?()[\]{}|]/g,ft=RegExp(it.source),ct=/^\s+|\s+$/g,at=/^\s+/,lt=/\s+$/,st=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,ht=/\{\n\/\* \[wrapped with (.+)\] \*/,pt=/,? & /,_t=/[a-zA-Z0-9]+/g,vt=/\\(\\)?/g,gt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,dt=/\w*$/,yt=/^0x/i,bt=/^[-+]0x[0-9a-f]+$/i,xt=/^0b[01]+$/i,jt=/^\[object .+?Constructor\]$/,wt=/^0o[0-7]+$/i,mt=/^(?:0|[1-9]\d*)$/,At=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Ot=/($^)/,kt=/['\n\r\u2028\u2029\\]/g,Et="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*",St="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+Et,Rt="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]?|[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",It=RegExp("['\u2019]","g"),Wt=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]","g"),Bt=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+Rt+Et,"g"),Mt=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d+",St].join("|"),"g"),Ct=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ufe0e\\ufe0f]"),Lt=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,zt="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise Reflect RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Ut={};
+Ut["[object Float32Array]"]=Ut["[object Float64Array]"]=Ut["[object Int8Array]"]=Ut["[object Int16Array]"]=Ut["[object Int32Array]"]=Ut["[object Uint8Array]"]=Ut["[object Uint8ClampedArray]"]=Ut["[object Uint16Array]"]=Ut["[object Uint32Array]"]=true,Ut["[object Arguments]"]=Ut["[object Array]"]=Ut["[object ArrayBuffer]"]=Ut["[object Boolean]"]=Ut["[object DataView]"]=Ut["[object Date]"]=Ut["[object Error]"]=Ut["[object Function]"]=Ut["[object Map]"]=Ut["[object Number]"]=Ut["[object Object]"]=Ut["[object RegExp]"]=Ut["[object Set]"]=Ut["[object String]"]=Ut["[object WeakMap]"]=false;
+var Dt={};Dt["[object Arguments]"]=Dt["[object Array]"]=Dt["[object ArrayBuffer]"]=Dt["[object DataView]"]=Dt["[object Boolean]"]=Dt["[object Date]"]=Dt["[object Float32Array]"]=Dt["[object Float64Array]"]=Dt["[object Int8Array]"]=Dt["[object Int16Array]"]=Dt["[object Int32Array]"]=Dt["[object Map]"]=Dt["[object Number]"]=Dt["[object Object]"]=Dt["[object RegExp]"]=Dt["[object Set]"]=Dt["[object String]"]=Dt["[object Symbol]"]=Dt["[object Uint8Array]"]=Dt["[object Uint8ClampedArray]"]=Dt["[object Uint16Array]"]=Dt["[object Uint32Array]"]=true,
+Dt["[object Error]"]=Dt["[object Function]"]=Dt["[object WeakMap]"]=false;var $t,Ft={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Tt=parseFloat,Nt=parseInt,Pt=typeof global=="object"&&global&&global.Object===Object&&global,Zt=typeof self=="object"&&self&&self.Object===Object&&self,qt=Pt||Zt||Function("return this")(),Vt=Pt&&typeof exports=="object"&&exports,Kt=Vt&&typeof module=="object"&&module,Gt=Kt&&Kt.exports===Vt,Jt=Gt&&Pt.h;t:{try{$t=Jt&&Jt.f("util");break t}catch(t){}
+$t=void 0}var Yt=$t&&$t.isArrayBuffer,Ht=$t&&$t.isDate,Qt=$t&&$t.isMap,Xt=$t&&$t.isRegExp,tn=$t&&$t.isSet,nn=$t&&$t.isTypedArray,rn=w({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n",
+"\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss"}),en=w({"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"}),un=w({"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"}),on=N();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(qt._=on,
+define(function(){return on})):Kt?((Kt.exports=on)._=on,Vt._=on):qt._=on}).call(this);
\ No newline at end of file
diff --git a/map.js b/map.js
index e9f9f22eb..22efee7b3 100644
--- a/map.js
+++ b/map.js
@@ -22,8 +22,7 @@ var arrayMap = require('./_arrayMap'),
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
* @example
*
diff --git a/mapKeys.js b/mapKeys.js
index 8af3ac5b4..ef73c5251 100644
--- a/mapKeys.js
+++ b/mapKeys.js
@@ -12,8 +12,7 @@ var baseForOwn = require('./_baseForOwn'),
* @since 3.8.0
* @category Object
* @param {Object} object The object to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Object} Returns the new mapped object.
* @see _.mapValues
* @example
diff --git a/mapValues.js b/mapValues.js
index 610f45810..b2af211a7 100644
--- a/mapValues.js
+++ b/mapValues.js
@@ -12,8 +12,7 @@ var baseForOwn = require('./_baseForOwn'),
* @since 2.4.0
* @category Object
* @param {Object} object The object to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Object} Returns the new mapped object.
* @see _.mapKeys
* @example
diff --git a/matches.js b/matches.js
index 9e97961f0..f791c34a9 100644
--- a/matches.js
+++ b/matches.js
@@ -17,13 +17,13 @@ var baseClone = require('./_baseClone'),
* @returns {Function} Returns the new spec function.
* @example
*
- * var users = [
- * { 'user': 'barney', 'age': 36, 'active': true },
- * { 'user': 'fred', 'age': 40, 'active': false }
+ * var objects = [
+ * { 'a': 1, 'b': 2, 'c': 3 },
+ * { 'a': 4, 'b': 5, 'c': 6 }
* ];
*
- * _.filter(users, _.matches({ 'age': 40, 'active': false }));
- * // => [{ 'user': 'fred', 'age': 40, 'active': false }]
+ * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
+ * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
*/
function matches(source) {
return baseMatches(baseClone(source, true));
diff --git a/matchesProperty.js b/matchesProperty.js
index 13dbdd03a..4496442cb 100644
--- a/matchesProperty.js
+++ b/matchesProperty.js
@@ -17,13 +17,13 @@ var baseClone = require('./_baseClone'),
* @returns {Function} Returns the new spec function.
* @example
*
- * var users = [
- * { 'user': 'barney' },
- * { 'user': 'fred' }
+ * var objects = [
+ * { 'a': 1, 'b': 2, 'c': 3 },
+ * { 'a': 4, 'b': 5, 'c': 6 }
* ];
*
- * _.find(users, _.matchesProperty('user', 'fred'));
- * // => { 'user': 'fred' }
+ * _.find(objects, _.matchesProperty('a', 4));
+ * // => { 'a': 4, 'b': 5, 'c': 6 }
*/
function matchesProperty(path, srcValue) {
return baseMatchesProperty(path, baseClone(srcValue, true));
diff --git a/maxBy.js b/maxBy.js
index 4627bac3e..2eba9c06f 100644
--- a/maxBy.js
+++ b/maxBy.js
@@ -12,8 +12,7 @@ var baseExtremum = require('./_baseExtremum'),
* @since 4.0.0
* @category Math
* @param {Array} array The array to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {*} Returns the maximum value.
* @example
*
@@ -28,7 +27,7 @@ var baseExtremum = require('./_baseExtremum'),
*/
function maxBy(array, iteratee) {
return (array && array.length)
- ? baseExtremum(array, baseIteratee(iteratee), baseGt)
+ ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt)
: undefined;
}
diff --git a/meanBy.js b/meanBy.js
index 970d79836..b0316716f 100644
--- a/meanBy.js
+++ b/meanBy.js
@@ -11,8 +11,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 4.7.0
* @category Math
* @param {Array} array The array to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {number} Returns the mean.
* @example
*
@@ -26,7 +25,7 @@ var baseIteratee = require('./_baseIteratee'),
* // => 5
*/
function meanBy(array, iteratee) {
- return baseMean(array, baseIteratee(iteratee));
+ return baseMean(array, baseIteratee(iteratee, 2));
}
module.exports = meanBy;
diff --git a/merge.js b/merge.js
index d5aac9ee5..4bbc3a181 100644
--- a/merge.js
+++ b/merge.js
@@ -21,16 +21,16 @@ var baseMerge = require('./_baseMerge'),
* @returns {Object} Returns `object`.
* @example
*
- * var users = {
- * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
+ * var object = {
+ * 'a': [{ 'b': 2 }, { 'd': 4 }]
* };
*
- * var ages = {
- * 'data': [{ 'age': 36 }, { 'age': 40 }]
+ * var other = {
+ * 'a': [{ 'c': 3 }, { 'e': 5 }]
* };
*
- * _.merge(users, ages);
- * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
+ * _.merge(object, other);
+ * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
*/
var merge = createAssigner(function(object, source, srcIndex) {
baseMerge(object, source, srcIndex);
diff --git a/mergeWith.js b/mergeWith.js
index 8fada62dd..a621dca2f 100644
--- a/mergeWith.js
+++ b/mergeWith.js
@@ -26,18 +26,11 @@ var baseMerge = require('./_baseMerge'),
* }
* }
*
- * var object = {
- * 'fruits': ['apple'],
- * 'vegetables': ['beet']
- * };
- *
- * var other = {
- * 'fruits': ['banana'],
- * 'vegetables': ['carrot']
- * };
+ * var object = { 'a': [1], 'b': [2] };
+ * var other = { 'a': [3], 'b': [4] };
*
* _.mergeWith(object, other, customizer);
- * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
+ * // => { 'a': [1, 3], 'b': [2, 4] }
*/
var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
baseMerge(object, source, srcIndex, customizer);
diff --git a/method.js b/method.js
index a4da99bdf..23ec32d55 100644
--- a/method.js
+++ b/method.js
@@ -1,5 +1,5 @@
var baseInvoke = require('./_baseInvoke'),
- rest = require('./rest');
+ baseRest = require('./_baseRest');
/**
* Creates a function that invokes the method at `path` of a given object.
@@ -25,7 +25,7 @@ var baseInvoke = require('./_baseInvoke'),
* _.map(objects, _.method(['a', 'b']));
* // => [2, 1]
*/
-var method = rest(function(path, args) {
+var method = baseRest(function(path, args) {
return function(object) {
return baseInvoke(object, path, args);
};
diff --git a/methodOf.js b/methodOf.js
index 62b049787..df59b57f3 100644
--- a/methodOf.js
+++ b/methodOf.js
@@ -1,5 +1,5 @@
var baseInvoke = require('./_baseInvoke'),
- rest = require('./rest');
+ baseRest = require('./_baseRest');
/**
* The opposite of `_.method`; this method creates a function that invokes
@@ -24,7 +24,7 @@ var baseInvoke = require('./_baseInvoke'),
* _.map([['a', '2'], ['c', '0']], _.methodOf(object));
* // => [2, 0]
*/
-var methodOf = rest(function(object, args) {
+var methodOf = baseRest(function(object, args) {
return function(path) {
return baseInvoke(object, path, args);
};
diff --git a/minBy.js b/minBy.js
index d58084659..b2697e49a 100644
--- a/minBy.js
+++ b/minBy.js
@@ -12,8 +12,7 @@ var baseExtremum = require('./_baseExtremum'),
* @since 4.0.0
* @category Math
* @param {Array} array The array to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {*} Returns the minimum value.
* @example
*
@@ -28,7 +27,7 @@ var baseExtremum = require('./_baseExtremum'),
*/
function minBy(array, iteratee) {
return (array && array.length)
- ? baseExtremum(array, baseIteratee(iteratee), baseLt)
+ ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt)
: undefined;
}
diff --git a/multiply.js b/multiply.js
index 57ba93985..d7876e139 100644
--- a/multiply.js
+++ b/multiply.js
@@ -17,6 +17,6 @@ var createMathOperation = require('./_createMathOperation');
*/
var multiply = createMathOperation(function(multiplier, multiplicand) {
return multiplier * multiplicand;
-});
+}, 1);
module.exports = multiply;
diff --git a/negate.js b/negate.js
index f0049c6b7..330e65ac6 100644
--- a/negate.js
+++ b/negate.js
@@ -26,7 +26,14 @@ function negate(predicate) {
throw new TypeError(FUNC_ERROR_TEXT);
}
return function() {
- return !predicate.apply(this, arguments);
+ var args = arguments;
+ switch (args.length) {
+ case 0: return !predicate.call(this);
+ case 1: return !predicate.call(this, args[0]);
+ case 2: return !predicate.call(this, args[0], args[1]);
+ case 3: return !predicate.call(this, args[0], args[1], args[2]);
+ }
+ return !predicate.apply(this, args);
};
}
diff --git a/noop.js b/noop.js
index a682a4465..3c0862ee6 100644
--- a/noop.js
+++ b/noop.js
@@ -1,5 +1,5 @@
/**
- * A method that returns `undefined`.
+ * This method returns `undefined`.
*
* @static
* @memberOf _
diff --git a/nthArg.js b/nthArg.js
index 7557653ae..09406ddf4 100644
--- a/nthArg.js
+++ b/nthArg.js
@@ -1,5 +1,5 @@
var baseNth = require('./_baseNth'),
- rest = require('./rest'),
+ baseRest = require('./_baseRest'),
toInteger = require('./toInteger');
/**
@@ -24,7 +24,7 @@ var baseNth = require('./_baseNth'),
*/
function nthArg(n) {
n = toInteger(n);
- return rest(function(args) {
+ return baseRest(function(args) {
return baseNth(args, n);
});
}
diff --git a/object.js b/object.js
index d6f51c8e1..f046b05f7 100644
--- a/object.js
+++ b/object.js
@@ -3,6 +3,7 @@ module.exports = {
'assignIn': require('./assignIn'),
'assignInWith': require('./assignInWith'),
'assignWith': require('./assignWith'),
+ 'at': require('./at'),
'create': require('./create'),
'defaults': require('./defaults'),
'defaultsDeep': require('./defaultsDeep'),
diff --git a/omit.js b/omit.js
index a19974da7..4ef0cafe4 100644
--- a/omit.js
+++ b/omit.js
@@ -2,8 +2,8 @@ var arrayMap = require('./_arrayMap'),
baseDifference = require('./_baseDifference'),
baseFlatten = require('./_baseFlatten'),
basePick = require('./_basePick'),
+ baseRest = require('./_baseRest'),
getAllKeysIn = require('./_getAllKeysIn'),
- rest = require('./rest'),
toKey = require('./_toKey');
/**
@@ -25,7 +25,7 @@ var arrayMap = require('./_arrayMap'),
* _.omit(object, ['a', 'c']);
* // => { 'b': '2' }
*/
-var omit = rest(function(object, props) {
+var omit = baseRest(function(object, props) {
if (object == null) {
return {};
}
diff --git a/omitBy.js b/omitBy.js
index 79505deaf..a064036eb 100644
--- a/omitBy.js
+++ b/omitBy.js
@@ -1,5 +1,6 @@
var baseIteratee = require('./_baseIteratee'),
- basePickBy = require('./_basePickBy');
+ negate = require('./negate'),
+ pickBy = require('./pickBy');
/**
* The opposite of `_.pickBy`; this method creates an object composed of
@@ -12,8 +13,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 4.0.0
* @category Object
* @param {Object} object The source object.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per property.
+ * @param {Function} [predicate=_.identity] The function invoked per property.
* @returns {Object} Returns the new object.
* @example
*
@@ -23,10 +23,7 @@ var baseIteratee = require('./_baseIteratee'),
* // => { 'b': '2' }
*/
function omitBy(object, predicate) {
- predicate = baseIteratee(predicate);
- return basePickBy(object, function(value, key) {
- return !predicate(value, key);
- });
+ return pickBy(object, negate(baseIteratee(predicate)));
}
module.exports = omitBy;
diff --git a/once.js b/once.js
index 4f66808a1..0706fc3cb 100644
--- a/once.js
+++ b/once.js
@@ -16,7 +16,7 @@ var before = require('./before');
* var initialize = _.once(createApplication);
* initialize();
* initialize();
- * // `initialize` invokes `createApplication` once
+ * // => `createApplication` is invoked once
*/
function once(func) {
return before(2, func);
diff --git a/over.js b/over.js
index 5301d57f7..bea2f91f8 100644
--- a/over.js
+++ b/over.js
@@ -9,8 +9,8 @@ var arrayMap = require('./_arrayMap'),
* @memberOf _
* @since 4.0.0
* @category Util
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [iteratees=[_.identity]] The iteratees to invoke.
+ * @param {...(Function|Function[])} [iteratees=[_.identity]]
+ * The iteratees to invoke.
* @returns {Function} Returns the new function.
* @example
*
diff --git a/overArgs.js b/overArgs.js
index 94f586b53..56d253bc6 100644
--- a/overArgs.js
+++ b/overArgs.js
@@ -2,25 +2,23 @@ var apply = require('./_apply'),
arrayMap = require('./_arrayMap'),
baseFlatten = require('./_baseFlatten'),
baseIteratee = require('./_baseIteratee'),
+ baseRest = require('./_baseRest'),
baseUnary = require('./_baseUnary'),
- isArray = require('./isArray'),
- isFlattenableIteratee = require('./_isFlattenableIteratee'),
- rest = require('./rest');
+ isArray = require('./isArray');
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min;
/**
- * Creates a function that invokes `func` with arguments transformed by
- * corresponding `transforms`.
+ * Creates a function that invokes `func` with its arguments transformed.
*
* @static
* @since 4.0.0
* @memberOf _
* @category Function
* @param {Function} func The function to wrap.
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [transforms[_.identity]] The functions to transform.
+ * @param {...(Function|Function[])} [transforms=[_.identity]]
+ * The argument transforms.
* @returns {Function} Returns the new function.
* @example
*
@@ -42,13 +40,13 @@ var nativeMin = Math.min;
* func(10, 5);
* // => [100, 10]
*/
-var overArgs = rest(function(func, transforms) {
+var overArgs = baseRest(function(func, transforms) {
transforms = (transforms.length == 1 && isArray(transforms[0]))
? arrayMap(transforms[0], baseUnary(baseIteratee))
- : arrayMap(baseFlatten(transforms, 1, isFlattenableIteratee), baseUnary(baseIteratee));
+ : arrayMap(baseFlatten(transforms, 1), baseUnary(baseIteratee));
var funcsLength = transforms.length;
- return rest(function(args) {
+ return baseRest(function(args) {
var index = -1,
length = nativeMin(args.length, funcsLength);
diff --git a/overEvery.js b/overEvery.js
index 1af6b7398..c115d1538 100644
--- a/overEvery.js
+++ b/overEvery.js
@@ -9,8 +9,8 @@ var arrayEvery = require('./_arrayEvery'),
* @memberOf _
* @since 4.0.0
* @category Util
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [predicates=[_.identity]] The predicates to check.
+ * @param {...(Function|Function[])} [predicates=[_.identity]]
+ * The predicates to check.
* @returns {Function} Returns the new function.
* @example
*
diff --git a/overSome.js b/overSome.js
index 9e3fe95c6..f902907a9 100644
--- a/overSome.js
+++ b/overSome.js
@@ -9,8 +9,8 @@ var arraySome = require('./_arraySome'),
* @memberOf _
* @since 4.0.0
* @category Util
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [predicates=[_.identity]] The predicates to check.
+ * @param {...(Function|Function[])} [predicates=[_.identity]]
+ * The predicates to check.
* @returns {Function} Returns the new function.
* @example
*
diff --git a/package.json b/package.json
index aa3d6d973..4f41e8669 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "lodash",
- "version": "4.13.1",
+ "version": "4.14.0",
"description": "Lodash modular utilities.",
"keywords": "modules, stdlib, util",
"homepage": "https://lodash.com/",
diff --git a/partial.js b/partial.js
index 916075d84..85d653553 100644
--- a/partial.js
+++ b/partial.js
@@ -1,9 +1,9 @@
-var createWrapper = require('./_createWrapper'),
+var baseRest = require('./_baseRest'),
+ createWrap = require('./_createWrap'),
getHolder = require('./_getHolder'),
- replaceHolders = require('./_replaceHolders'),
- rest = require('./rest');
+ replaceHolders = require('./_replaceHolders');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var PARTIAL_FLAG = 32;
/**
@@ -26,9 +26,9 @@ var PARTIAL_FLAG = 32;
* @returns {Function} Returns the new partially applied function.
* @example
*
- * var greet = function(greeting, name) {
+ * function greet(greeting, name) {
* return greeting + ' ' + name;
- * };
+ * }
*
* var sayHelloTo = _.partial(greet, 'hello');
* sayHelloTo('fred');
@@ -39,9 +39,9 @@ var PARTIAL_FLAG = 32;
* greetFred('hi');
* // => 'hi fred'
*/
-var partial = rest(function(func, partials) {
+var partial = baseRest(function(func, partials) {
var holders = replaceHolders(partials, getHolder(partial));
- return createWrapper(func, PARTIAL_FLAG, undefined, partials, holders);
+ return createWrap(func, PARTIAL_FLAG, undefined, partials, holders);
});
// Assign default placeholders.
diff --git a/partialRight.js b/partialRight.js
index a80a34ab0..813aa5774 100644
--- a/partialRight.js
+++ b/partialRight.js
@@ -1,9 +1,9 @@
-var createWrapper = require('./_createWrapper'),
+var baseRest = require('./_baseRest'),
+ createWrap = require('./_createWrap'),
getHolder = require('./_getHolder'),
- replaceHolders = require('./_replaceHolders'),
- rest = require('./rest');
+ replaceHolders = require('./_replaceHolders');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var PARTIAL_RIGHT_FLAG = 64;
/**
@@ -25,9 +25,9 @@ var PARTIAL_RIGHT_FLAG = 64;
* @returns {Function} Returns the new partially applied function.
* @example
*
- * var greet = function(greeting, name) {
+ * function greet(greeting, name) {
* return greeting + ' ' + name;
- * };
+ * }
*
* var greetFred = _.partialRight(greet, 'fred');
* greetFred('hi');
@@ -38,9 +38,9 @@ var PARTIAL_RIGHT_FLAG = 64;
* sayHelloTo('fred');
* // => 'hello fred'
*/
-var partialRight = rest(function(func, partials) {
+var partialRight = baseRest(function(func, partials) {
var holders = replaceHolders(partials, getHolder(partialRight));
- return createWrapper(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders);
+ return createWrap(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders);
});
// Assign default placeholders.
diff --git a/partition.js b/partition.js
index 2e30e8b97..6b814a9f2 100644
--- a/partition.js
+++ b/partition.js
@@ -11,8 +11,7 @@ var createAggregator = require('./_createAggregator');
* @since 3.0.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {Array} Returns the array of grouped elements.
* @example
*
diff --git a/pick.js b/pick.js
index 28125865c..464dd9f92 100644
--- a/pick.js
+++ b/pick.js
@@ -1,7 +1,7 @@
var arrayMap = require('./_arrayMap'),
baseFlatten = require('./_baseFlatten'),
basePick = require('./_basePick'),
- rest = require('./rest'),
+ baseRest = require('./_baseRest'),
toKey = require('./_toKey');
/**
@@ -21,7 +21,7 @@ var arrayMap = require('./_arrayMap'),
* _.pick(object, ['a', 'c']);
* // => { 'a': 1, 'c': 3 }
*/
-var pick = rest(function(object, props) {
+var pick = baseRest(function(object, props) {
return object == null ? {} : basePick(object, arrayMap(baseFlatten(props, 1), toKey));
});
diff --git a/pickBy.js b/pickBy.js
index d355442c9..6e9e193ec 100644
--- a/pickBy.js
+++ b/pickBy.js
@@ -1,5 +1,6 @@
var baseIteratee = require('./_baseIteratee'),
- basePickBy = require('./_basePickBy');
+ basePickBy = require('./_basePickBy'),
+ getAllKeysIn = require('./_getAllKeysIn');
/**
* Creates an object composed of the `object` properties `predicate` returns
@@ -10,8 +11,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 4.0.0
* @category Object
* @param {Object} object The source object.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per property.
+ * @param {Function} [predicate=_.identity] The function invoked per property.
* @returns {Object} Returns the new object.
* @example
*
@@ -21,7 +21,7 @@ var baseIteratee = require('./_baseIteratee'),
* // => { 'a': 1, 'c': 3 }
*/
function pickBy(object, predicate) {
- return object == null ? {} : basePickBy(object, baseIteratee(predicate));
+ return object == null ? {} : basePickBy(object, getAllKeysIn(object), baseIteratee(predicate));
}
module.exports = pickBy;
diff --git a/pull.js b/pull.js
index 74b2771da..c136c06e8 100644
--- a/pull.js
+++ b/pull.js
@@ -1,5 +1,5 @@
-var pullAll = require('./pullAll'),
- rest = require('./rest');
+var baseRest = require('./_baseRest'),
+ pullAll = require('./pullAll');
/**
* Removes all given values from `array` using
@@ -24,6 +24,6 @@ var pullAll = require('./pullAll'),
* console.log(array);
* // => ['b', 'b']
*/
-var pull = rest(pullAll);
+var pull = baseRest(pullAll);
module.exports = pull;
diff --git a/pullAllBy.js b/pullAllBy.js
index 7192650c3..dbfe8647d 100644
--- a/pullAllBy.js
+++ b/pullAllBy.js
@@ -14,7 +14,7 @@ var baseIteratee = require('./_baseIteratee'),
* @category Array
* @param {Array} array The array to modify.
* @param {Array} values The values to remove.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {Array} Returns `array`.
* @example
@@ -27,7 +27,7 @@ var baseIteratee = require('./_baseIteratee'),
*/
function pullAllBy(array, values, iteratee) {
return (array && array.length && values && values.length)
- ? basePullAll(array, values, baseIteratee(iteratee))
+ ? basePullAll(array, values, baseIteratee(iteratee, 2))
: array;
}
diff --git a/pullAt.js b/pullAt.js
index 01e566e62..59b5fa35a 100644
--- a/pullAt.js
+++ b/pullAt.js
@@ -2,9 +2,9 @@ var arrayMap = require('./_arrayMap'),
baseAt = require('./_baseAt'),
baseFlatten = require('./_baseFlatten'),
basePullAt = require('./_basePullAt'),
+ baseRest = require('./_baseRest'),
compareAscending = require('./_compareAscending'),
- isIndex = require('./_isIndex'),
- rest = require('./rest');
+ isIndex = require('./_isIndex');
/**
* Removes elements from `array` corresponding to `indexes` and returns an
@@ -30,7 +30,7 @@ var arrayMap = require('./_arrayMap'),
* console.log(pulled);
* // => ['b', 'd']
*/
-var pullAt = rest(function(array, indexes) {
+var pullAt = baseRest(function(array, indexes) {
indexes = baseFlatten(indexes, 1);
var length = array ? array.length : 0,
diff --git a/rearg.js b/rearg.js
index b098d80d3..fabe5a383 100644
--- a/rearg.js
+++ b/rearg.js
@@ -1,8 +1,8 @@
var baseFlatten = require('./_baseFlatten'),
- createWrapper = require('./_createWrapper'),
- rest = require('./rest');
+ baseRest = require('./_baseRest'),
+ createWrap = require('./_createWrap');
-/** Used to compose bitmasks for wrapper metadata. */
+/** Used to compose bitmasks for function metadata. */
var REARG_FLAG = 256;
/**
@@ -27,8 +27,8 @@ var REARG_FLAG = 256;
* rearged('b', 'c', 'a')
* // => ['a', 'b', 'c']
*/
-var rearg = rest(function(func, indexes) {
- return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes, 1));
+var rearg = baseRest(function(func, indexes) {
+ return createWrap(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes, 1));
});
module.exports = rearg;
diff --git a/reject.js b/reject.js
index 4ed47b383..a13e55474 100644
--- a/reject.js
+++ b/reject.js
@@ -1,7 +1,8 @@
var arrayFilter = require('./_arrayFilter'),
baseFilter = require('./_baseFilter'),
baseIteratee = require('./_baseIteratee'),
- isArray = require('./isArray');
+ isArray = require('./isArray'),
+ negate = require('./negate');
/**
* The opposite of `_.filter`; this method returns the elements of `collection`
@@ -12,8 +13,7 @@ var arrayFilter = require('./_arrayFilter'),
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @returns {Array} Returns the new filtered array.
* @see _.filter
* @example
@@ -40,10 +40,7 @@ var arrayFilter = require('./_arrayFilter'),
*/
function reject(collection, predicate) {
var func = isArray(collection) ? arrayFilter : baseFilter;
- predicate = baseIteratee(predicate, 3);
- return func(collection, function(value, index, collection) {
- return !predicate(value, index, collection);
- });
+ return func(collection, negate(baseIteratee(predicate, 3)));
}
module.exports = reject;
diff --git a/remove.js b/remove.js
index ef3d68187..925d31899 100644
--- a/remove.js
+++ b/remove.js
@@ -14,7 +14,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 2.0.0
* @category Array
* @param {Array} array The array to modify.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the new array of removed elements.
* @example
diff --git a/rest.js b/rest.js
index ddb732694..ab2d145b5 100644
--- a/rest.js
+++ b/rest.js
@@ -1,12 +1,9 @@
-var apply = require('./_apply'),
+var baseRest = require('./_baseRest'),
toInteger = require('./toInteger');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
/**
* Creates a function that invokes `func` with the `this` binding of the
* created function and arguments from `start` and beyond provided as
@@ -36,29 +33,8 @@ function rest(func, start) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
- start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);
- return function() {
- var args = arguments,
- index = -1,
- length = nativeMax(args.length - start, 0),
- array = Array(length);
-
- while (++index < length) {
- array[index] = args[start + index];
- }
- switch (start) {
- case 0: return func.call(this, array);
- case 1: return func.call(this, args[0], array);
- case 2: return func.call(this, args[0], args[1], array);
- }
- var otherArgs = Array(start + 1);
- index = -1;
- while (++index < start) {
- otherArgs[index] = args[index];
- }
- otherArgs[start] = array;
- return apply(func, this, otherArgs);
- };
+ start = start === undefined ? start : toInteger(start);
+ return baseRest(func, start);
}
module.exports = rest;
diff --git a/some.js b/some.js
index eeb7c18ad..9c1d08cc8 100644
--- a/some.js
+++ b/some.js
@@ -14,8 +14,7 @@ var arraySome = require('./_arraySome'),
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [predicate=_.identity]
- * The function invoked per iteration.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
* @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
diff --git a/sortBy.js b/sortBy.js
index c6d40bbb7..5fbee44c7 100644
--- a/sortBy.js
+++ b/sortBy.js
@@ -1,9 +1,7 @@
var baseFlatten = require('./_baseFlatten'),
baseOrderBy = require('./_baseOrderBy'),
- isArray = require('./isArray'),
- isFlattenableIteratee = require('./_isFlattenableIteratee'),
- isIterateeCall = require('./_isIterateeCall'),
- rest = require('./rest');
+ baseRest = require('./_baseRest'),
+ isIterateeCall = require('./_isIterateeCall');
/**
* Creates an array of elements, sorted in ascending order by the results of
@@ -16,8 +14,8 @@ var baseFlatten = require('./_baseFlatten'),
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to iterate over.
- * @param {...(Array|Array[]|Function|Function[]|Object|Object[]|string|string[])}
- * [iteratees=[_.identity]] The iteratees to sort by.
+ * @param {...(Function|Function[])} [iteratees=[_.identity]]
+ * The iteratees to sort by.
* @returns {Array} Returns the new sorted array.
* @example
*
@@ -39,7 +37,7 @@ var baseFlatten = require('./_baseFlatten'),
* });
* // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
*/
-var sortBy = rest(function(collection, iteratees) {
+var sortBy = baseRest(function(collection, iteratees) {
if (collection == null) {
return [];
}
@@ -49,11 +47,7 @@ var sortBy = rest(function(collection, iteratees) {
} else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
iteratees = [iteratees[0]];
}
- iteratees = (iteratees.length == 1 && isArray(iteratees[0]))
- ? iteratees[0]
- : baseFlatten(iteratees, 1, isFlattenableIteratee);
-
- return baseOrderBy(collection, iteratees, []);
+ return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
});
module.exports = sortBy;
diff --git a/sortedIndexBy.js b/sortedIndexBy.js
index 0326eb77f..a1224e984 100644
--- a/sortedIndexBy.js
+++ b/sortedIndexBy.js
@@ -12,7 +12,7 @@ var baseIteratee = require('./_baseIteratee'),
* @category Array
* @param {Array} array The sorted array to inspect.
* @param {*} value The value to evaluate.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
@@ -28,7 +28,7 @@ var baseIteratee = require('./_baseIteratee'),
* // => 0
*/
function sortedIndexBy(array, value, iteratee) {
- return baseSortedIndexBy(array, value, baseIteratee(iteratee));
+ return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2));
}
module.exports = sortedIndexBy;
diff --git a/sortedLastIndexBy.js b/sortedLastIndexBy.js
index f2ba954a3..94811fb0f 100644
--- a/sortedLastIndexBy.js
+++ b/sortedLastIndexBy.js
@@ -12,7 +12,7 @@ var baseIteratee = require('./_baseIteratee'),
* @category Array
* @param {Array} array The sorted array to inspect.
* @param {*} value The value to evaluate.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
@@ -28,7 +28,7 @@ var baseIteratee = require('./_baseIteratee'),
* // => 1
*/
function sortedLastIndexBy(array, value, iteratee) {
- return baseSortedIndexBy(array, value, baseIteratee(iteratee), true);
+ return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2), true);
}
module.exports = sortedLastIndexBy;
diff --git a/sortedUniqBy.js b/sortedUniqBy.js
index 1cbdeafb4..4f05ebe91 100644
--- a/sortedUniqBy.js
+++ b/sortedUniqBy.js
@@ -19,7 +19,7 @@ var baseIteratee = require('./_baseIteratee'),
*/
function sortedUniqBy(array, iteratee) {
return (array && array.length)
- ? baseSortedUniq(array, baseIteratee(iteratee))
+ ? baseSortedUniq(array, baseIteratee(iteratee, 2))
: [];
}
diff --git a/spread.js b/spread.js
index 9d32bb96e..c537dfa9b 100644
--- a/spread.js
+++ b/spread.js
@@ -1,7 +1,7 @@
var apply = require('./_apply'),
arrayPush = require('./_arrayPush'),
+ baseRest = require('./_baseRest'),
castSlice = require('./_castSlice'),
- rest = require('./rest'),
toInteger = require('./toInteger');
/** Used as the `TypeError` message for "Functions" methods. */
@@ -49,7 +49,7 @@ function spread(func, start) {
throw new TypeError(FUNC_ERROR_TEXT);
}
start = start === undefined ? 0 : nativeMax(toInteger(start), 0);
- return rest(function(args) {
+ return baseRest(function(args) {
var array = args[start],
otherArgs = castSlice(args, 0, start);
diff --git a/startsWith.js b/startsWith.js
index 888185524..04509f05d 100644
--- a/startsWith.js
+++ b/startsWith.js
@@ -29,7 +29,8 @@ var baseClamp = require('./_baseClamp'),
function startsWith(string, target, position) {
string = toString(string);
position = baseClamp(toInteger(position), 0, string.length);
- return string.lastIndexOf(baseToString(target), position) == position;
+ target = baseToString(target);
+ return string.slice(position, position + target.length) == target;
}
module.exports = startsWith;
diff --git a/stubArray.js b/stubArray.js
index 16cbf9956..f460c15e3 100644
--- a/stubArray.js
+++ b/stubArray.js
@@ -1,5 +1,5 @@
/**
- * A method that returns a new empty array.
+ * This method returns a new empty array.
*
* @static
* @memberOf _
diff --git a/stubFalse.js b/stubFalse.js
index 4498027b3..9b346fce5 100644
--- a/stubFalse.js
+++ b/stubFalse.js
@@ -1,5 +1,5 @@
/**
- * A method that returns `false`.
+ * This method returns `false`.
*
* @static
* @memberOf _
diff --git a/stubObject.js b/stubObject.js
index 9da12c209..1d190a1d0 100644
--- a/stubObject.js
+++ b/stubObject.js
@@ -1,5 +1,5 @@
/**
- * A method that returns a new empty object.
+ * This method returns a new empty object.
*
* @static
* @memberOf _
diff --git a/stubString.js b/stubString.js
index 2f14bcf5c..2db0bed07 100644
--- a/stubString.js
+++ b/stubString.js
@@ -1,5 +1,5 @@
/**
- * A method that returns an empty string.
+ * This method returns an empty string.
*
* @static
* @memberOf _
diff --git a/stubTrue.js b/stubTrue.js
index c166806e1..af3cc9edc 100644
--- a/stubTrue.js
+++ b/stubTrue.js
@@ -1,5 +1,5 @@
/**
- * A method that returns `true`.
+ * This method returns `true`.
*
* @static
* @memberOf _
diff --git a/subtract.js b/subtract.js
index bd4086a00..67207785d 100644
--- a/subtract.js
+++ b/subtract.js
@@ -17,6 +17,6 @@ var createMathOperation = require('./_createMathOperation');
*/
var subtract = createMathOperation(function(minuend, subtrahend) {
return minuend - subtrahend;
-});
+}, 0);
module.exports = subtract;
diff --git a/sumBy.js b/sumBy.js
index ce73c8449..00e36d00e 100644
--- a/sumBy.js
+++ b/sumBy.js
@@ -11,8 +11,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 4.0.0
* @category Math
* @param {Array} array The array to iterate over.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
- * The iteratee invoked per element.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
* @returns {number} Returns the sum.
* @example
*
@@ -27,7 +26,7 @@ var baseIteratee = require('./_baseIteratee'),
*/
function sumBy(array, iteratee) {
return (array && array.length)
- ? baseSum(array, baseIteratee(iteratee))
+ ? baseSum(array, baseIteratee(iteratee, 2))
: 0;
}
diff --git a/takeRightWhile.js b/takeRightWhile.js
index 1d4975061..2a8087156 100644
--- a/takeRightWhile.js
+++ b/takeRightWhile.js
@@ -11,7 +11,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 3.0.0
* @category Array
* @param {Array} array The array to query.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the slice of `array`.
* @example
diff --git a/takeWhile.js b/takeWhile.js
index 128375592..f881d930f 100644
--- a/takeWhile.js
+++ b/takeWhile.js
@@ -11,7 +11,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 3.0.0
* @category Array
* @param {Array} array The array to query.
- * @param {Array|Function|Object|string} [predicate=_.identity]
+ * @param {Function} [predicate=_.identity]
* The function invoked per iteration.
* @returns {Array} Returns the slice of `array`.
* @example
diff --git a/toArray.js b/toArray.js
index 6675806bb..8a1102d24 100644
--- a/toArray.js
+++ b/toArray.js
@@ -14,7 +14,7 @@ var mapTag = '[object Map]',
setTag = '[object Set]';
/** Built-in value references. */
-var iteratorSymbol = typeof (iteratorSymbol = Symbol && Symbol.iterator) == 'symbol' ? iteratorSymbol : undefined;
+var iteratorSymbol = Symbol ? Symbol.iterator : undefined;
/**
* Converts `value` to an array.
diff --git a/union.js b/union.js
index 80e64b5eb..d448d8be2 100644
--- a/union.js
+++ b/union.js
@@ -1,7 +1,7 @@
var baseFlatten = require('./_baseFlatten'),
+ baseRest = require('./_baseRest'),
baseUniq = require('./_baseUniq'),
- isArrayLikeObject = require('./isArrayLikeObject'),
- rest = require('./rest');
+ isArrayLikeObject = require('./isArrayLikeObject');
/**
* Creates an array of unique values, in order, from all given arrays using
@@ -19,7 +19,7 @@ var baseFlatten = require('./_baseFlatten'),
* _.union([2], [1, 2]);
* // => [2, 1]
*/
-var union = rest(function(arrays) {
+var union = baseRest(function(arrays) {
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
});
diff --git a/unionBy.js b/unionBy.js
index 6d6fe2b03..e082f6259 100644
--- a/unionBy.js
+++ b/unionBy.js
@@ -1,14 +1,15 @@
var baseFlatten = require('./_baseFlatten'),
baseIteratee = require('./_baseIteratee'),
+ baseRest = require('./_baseRest'),
baseUniq = require('./_baseUniq'),
isArrayLikeObject = require('./isArrayLikeObject'),
- last = require('./last'),
- rest = require('./rest');
+ last = require('./last');
/**
* This method is like `_.union` except that it accepts `iteratee` which is
* invoked for each element of each `arrays` to generate the criterion by
- * which uniqueness is computed. The iteratee is invoked with one argument:
+ * which uniqueness is computed. Result values are chosen from the first
+ * array in which the value occurs. The iteratee is invoked with one argument:
* (value).
*
* @static
@@ -16,7 +17,7 @@ var baseFlatten = require('./_baseFlatten'),
* @since 4.0.0
* @category Array
* @param {...Array} [arrays] The arrays to inspect.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {Array} Returns the new array of combined values.
* @example
@@ -28,12 +29,12 @@ var baseFlatten = require('./_baseFlatten'),
* _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
* // => [{ 'x': 1 }, { 'x': 2 }]
*/
-var unionBy = rest(function(arrays) {
+var unionBy = baseRest(function(arrays) {
var iteratee = last(arrays);
if (isArrayLikeObject(iteratee)) {
iteratee = undefined;
}
- return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee));
+ return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
});
module.exports = unionBy;
diff --git a/unionWith.js b/unionWith.js
index dad71f9f3..46348b9b6 100644
--- a/unionWith.js
+++ b/unionWith.js
@@ -1,12 +1,13 @@
var baseFlatten = require('./_baseFlatten'),
+ baseRest = require('./_baseRest'),
baseUniq = require('./_baseUniq'),
isArrayLikeObject = require('./isArrayLikeObject'),
- last = require('./last'),
- rest = require('./rest');
+ last = require('./last');
/**
* This method is like `_.union` except that it accepts `comparator` which
- * is invoked to compare elements of `arrays`. The comparator is invoked
+ * is invoked to compare elements of `arrays`. Result values are chosen from
+ * the first array in which the value occurs. The comparator is invoked
* with two arguments: (arrVal, othVal).
*
* @static
@@ -24,7 +25,7 @@ var baseFlatten = require('./_baseFlatten'),
* _.unionWith(objects, others, _.isEqual);
* // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
*/
-var unionWith = rest(function(arrays) {
+var unionWith = baseRest(function(arrays) {
var comparator = last(arrays);
if (isArrayLikeObject(comparator)) {
comparator = undefined;
diff --git a/uniqBy.js b/uniqBy.js
index 91cf9e063..d67d4f161 100644
--- a/uniqBy.js
+++ b/uniqBy.js
@@ -11,7 +11,7 @@ var baseIteratee = require('./_baseIteratee'),
* @since 4.0.0
* @category Array
* @param {Array} array The array to inspect.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {Array} Returns the new duplicate free array.
* @example
@@ -25,7 +25,7 @@ var baseIteratee = require('./_baseIteratee'),
*/
function uniqBy(array, iteratee) {
return (array && array.length)
- ? baseUniq(array, baseIteratee(iteratee))
+ ? baseUniq(array, baseIteratee(iteratee, 2))
: [];
}
diff --git a/unzip.js b/unzip.js
index 7990d26e8..fce0ec78d 100644
--- a/unzip.js
+++ b/unzip.js
@@ -20,11 +20,11 @@ var nativeMax = Math.max;
* @returns {Array} Returns the new array of regrouped elements.
* @example
*
- * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);
- * // => [['fred', 30, true], ['barney', 40, false]]
+ * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
+ * // => [['a', 1, true], ['b', 2, false]]
*
* _.unzip(zipped);
- * // => [['fred', 'barney'], [30, 40], [true, false]]
+ * // => [['a', 'b'], [1, 2], [true, false]]
*/
function unzip(array) {
if (!(array && array.length)) {
diff --git a/util.js b/util.js
index 156972273..d244dc27e 100644
--- a/util.js
+++ b/util.js
@@ -4,6 +4,7 @@ module.exports = {
'cond': require('./cond'),
'conforms': require('./conforms'),
'constant': require('./constant'),
+ 'defaultTo': require('./defaultTo'),
'flow': require('./flow'),
'flowRight': require('./flowRight'),
'identity': require('./identity'),
diff --git a/without.js b/without.js
index 6198490a3..13cc11fc0 100644
--- a/without.js
+++ b/without.js
@@ -1,12 +1,14 @@
var baseDifference = require('./_baseDifference'),
- isArrayLikeObject = require('./isArrayLikeObject'),
- rest = require('./rest');
+ baseRest = require('./_baseRest'),
+ isArrayLikeObject = require('./isArrayLikeObject');
/**
* Creates an array excluding all given values using
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons.
*
+ * **Note:** Unlike `_.pull`, this method returns a new array.
+ *
* @static
* @memberOf _
* @since 0.1.0
@@ -20,7 +22,7 @@ var baseDifference = require('./_baseDifference'),
* _.without([2, 1, 2, 3], 1, 2);
* // => [3]
*/
-var without = rest(function(array, values) {
+var without = baseRest(function(array, values) {
return isArrayLikeObject(array)
? baseDifference(array, values)
: [];
diff --git a/wrap.js b/wrap.js
index 9a4542de3..205d7f46e 100644
--- a/wrap.js
+++ b/wrap.js
@@ -2,10 +2,10 @@ var identity = require('./identity'),
partial = require('./partial');
/**
- * Creates a function that provides `value` to the wrapper function as its
- * first argument. Any additional arguments provided to the function are
- * appended to those provided to the wrapper function. The wrapper is invoked
- * with the `this` binding of the created function.
+ * Creates a function that provides `value` to `wrapper` as its first
+ * argument. Any additional arguments provided to the function are appended
+ * to those provided to the `wrapper`. The wrapper is invoked with the `this`
+ * binding of the created function.
*
* @static
* @memberOf _
diff --git a/wrapperAt.js b/wrapperAt.js
index 4a3eacc35..829851125 100644
--- a/wrapperAt.js
+++ b/wrapperAt.js
@@ -2,8 +2,8 @@ var LazyWrapper = require('./_LazyWrapper'),
LodashWrapper = require('./_LodashWrapper'),
baseAt = require('./_baseAt'),
baseFlatten = require('./_baseFlatten'),
+ baseRest = require('./_baseRest'),
isIndex = require('./_isIndex'),
- rest = require('./rest'),
thru = require('./thru');
/**
@@ -22,7 +22,7 @@ var LazyWrapper = require('./_LazyWrapper'),
* _(object).at(['a[0].b.c', 'a[1]']).value();
* // => [3, 4]
*/
-var wrapperAt = rest(function(paths) {
+var wrapperAt = baseRest(function(paths) {
paths = baseFlatten(paths, 1);
var length = paths.length,
start = length ? paths[0] : 0,
diff --git a/wrapperLodash.js b/wrapperLodash.js
index ef84f2519..bf27a3cbe 100644
--- a/wrapperLodash.js
+++ b/wrapperLodash.js
@@ -77,16 +77,16 @@ var hasOwnProperty = objectProto.hasOwnProperty;
*
* The wrapper methods that are **not** chainable by default are:
* `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
- * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `deburr`, `divide`, `each`,
- * `eachRight`, `endsWith`, `eq`, `escape`, `escapeRegExp`, `every`, `find`,
- * `findIndex`, `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `first`,
- * `floor`, `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`,
- * `forOwnRight`, `get`, `gt`, `gte`, `has`, `hasIn`, `head`, `identity`,
- * `includes`, `indexOf`, `inRange`, `invoke`, `isArguments`, `isArray`,
- * `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`,
- * `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`,
- * `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMap`,
- * `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
+ * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
+ * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
+ * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
+ * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
+ * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
+ * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
+ * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
+ * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
+ * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
+ * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
* `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
* `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
* `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
diff --git a/xor.js b/xor.js
index ad63b6254..d4d286045 100644
--- a/xor.js
+++ b/xor.js
@@ -1,7 +1,7 @@
var arrayFilter = require('./_arrayFilter'),
+ baseRest = require('./_baseRest'),
baseXor = require('./_baseXor'),
- isArrayLikeObject = require('./isArrayLikeObject'),
- rest = require('./rest');
+ isArrayLikeObject = require('./isArrayLikeObject');
/**
* Creates an array of unique values that is the
@@ -21,7 +21,7 @@ var arrayFilter = require('./_arrayFilter'),
* _.xor([2, 1], [2, 3]);
* // => [1, 3]
*/
-var xor = rest(function(arrays) {
+var xor = baseRest(function(arrays) {
return baseXor(arrayFilter(arrays, isArrayLikeObject));
});
diff --git a/xorBy.js b/xorBy.js
index 924f82d2c..00b03108b 100644
--- a/xorBy.js
+++ b/xorBy.js
@@ -1,9 +1,9 @@
var arrayFilter = require('./_arrayFilter'),
baseIteratee = require('./_baseIteratee'),
+ baseRest = require('./_baseRest'),
baseXor = require('./_baseXor'),
isArrayLikeObject = require('./isArrayLikeObject'),
- last = require('./last'),
- rest = require('./rest');
+ last = require('./last');
/**
* This method is like `_.xor` except that it accepts `iteratee` which is
@@ -16,7 +16,7 @@ var arrayFilter = require('./_arrayFilter'),
* @since 4.0.0
* @category Array
* @param {...Array} [arrays] The arrays to inspect.
- * @param {Array|Function|Object|string} [iteratee=_.identity]
+ * @param {Function} [iteratee=_.identity]
* The iteratee invoked per element.
* @returns {Array} Returns the new array of filtered values.
* @example
@@ -28,12 +28,12 @@ var arrayFilter = require('./_arrayFilter'),
* _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
* // => [{ 'x': 2 }]
*/
-var xorBy = rest(function(arrays) {
+var xorBy = baseRest(function(arrays) {
var iteratee = last(arrays);
if (isArrayLikeObject(iteratee)) {
iteratee = undefined;
}
- return baseXor(arrayFilter(arrays, isArrayLikeObject), baseIteratee(iteratee));
+ return baseXor(arrayFilter(arrays, isArrayLikeObject), baseIteratee(iteratee, 2));
});
module.exports = xorBy;
diff --git a/xorWith.js b/xorWith.js
index d03a4a303..4bd9071d9 100644
--- a/xorWith.js
+++ b/xorWith.js
@@ -1,8 +1,8 @@
var arrayFilter = require('./_arrayFilter'),
+ baseRest = require('./_baseRest'),
baseXor = require('./_baseXor'),
isArrayLikeObject = require('./isArrayLikeObject'),
- last = require('./last'),
- rest = require('./rest');
+ last = require('./last');
/**
* This method is like `_.xor` except that it accepts `comparator` which is
@@ -24,7 +24,7 @@ var arrayFilter = require('./_arrayFilter'),
* _.xorWith(objects, others, _.isEqual);
* // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
*/
-var xorWith = rest(function(arrays) {
+var xorWith = baseRest(function(arrays) {
var comparator = last(arrays);
if (isArrayLikeObject(comparator)) {
comparator = undefined;
diff --git a/zip.js b/zip.js
index e1cbbbbc5..c800ab3d1 100644
--- a/zip.js
+++ b/zip.js
@@ -1,4 +1,4 @@
-var rest = require('./rest'),
+var baseRest = require('./_baseRest'),
unzip = require('./unzip');
/**
@@ -14,9 +14,9 @@ var rest = require('./rest'),
* @returns {Array} Returns the new array of grouped elements.
* @example
*
- * _.zip(['fred', 'barney'], [30, 40], [true, false]);
- * // => [['fred', 30, true], ['barney', 40, false]]
+ * _.zip(['a', 'b'], [1, 2], [true, false]);
+ * // => [['a', 1, true], ['b', 2, false]]
*/
-var zip = rest(unzip);
+var zip = baseRest(unzip);
module.exports = zip;
diff --git a/zipWith.js b/zipWith.js
index d01b6388c..18945ebc0 100644
--- a/zipWith.js
+++ b/zipWith.js
@@ -1,4 +1,4 @@
-var rest = require('./rest'),
+var baseRest = require('./_baseRest'),
unzipWith = require('./unzipWith');
/**
@@ -20,7 +20,7 @@ var rest = require('./rest'),
* });
* // => [111, 222]
*/
-var zipWith = rest(function(arrays) {
+var zipWith = baseRest(function(arrays) {
var length = arrays.length,
iteratee = length > 1 ? arrays[length - 1] : undefined;