Compare commits

...

1 Commits

Author SHA1 Message Date
John-David Dalton
94d714007e Bump to v3.10.1. 2015-12-16 17:52:47 -08:00
40 changed files with 105 additions and 103 deletions

View File

@@ -1,4 +1,4 @@
# lodash v3.10.0 # lodash v3.10.1
The [modern build](https://github.com/lodash/lodash/wiki/Build-Differences) of [lodash](https://lodash.com/) exported as [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules. The [modern build](https://github.com/lodash/lodash/wiki/Build-Differences) of [lodash](https://lodash.com/) exported as [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules.
@@ -13,8 +13,8 @@ $ lodash modern exports=amd -d -o ./main.js
Using bower or volo: Using bower or volo:
```bash ```bash
$ bower i lodash#3.10.0-amd $ bower i lodash#3.10.1-amd
$ volo add lodash/3.10.0-amd $ volo add lodash/3.10.1-amd
``` ```
Defining a build as `'lodash'`. Defining a build as `'lodash'`.

View File

@@ -2,7 +2,7 @@ define(['../internal/baseFlatten', '../internal/isIterateeCall'], function(baseF
/** /**
* Flattens a nested array. If `isDeep` is `true` the array is recursively * Flattens a nested array. If `isDeep` is `true` the array is recursively
* flattened, otherwise it is only flattened a single level. * flattened, otherwise it's only flattened a single level.
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -6,7 +6,7 @@ define(['../internal/baseIndexOf', '../internal/binaryIndex'], function(baseInde
/** /**
* Gets the index at which the first occurrence of `value` is found in `array` * Gets the index at which the first occurrence of `value` is found in `array`
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons. If `fromIndex` is negative, it is used as the offset * for equality comparisons. If `fromIndex` is negative, it's used as the offset
* from the end of `array`. If `array` is sorted providing `true` for `fromIndex` * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
* performs a faster binary search. * performs a faster binary search.
* *

View File

@@ -3,7 +3,7 @@ define(['../internal/createSortedIndex'], function(createSortedIndex) {
/** /**
* Uses a binary search to determine the lowest index at which `value` should * Uses a binary search to determine the lowest index at which `value` should
* be inserted into `array` in order to maintain its sort order. If an iteratee * be inserted into `array` in order to maintain its sort order. If an iteratee
* function is provided it is invoked for `value` and each element of `array` * function is provided it's invoked for `value` and each element of `array`
* to compute their sort ranking. The iteratee is bound to `thisArg` and * to compute their sort ranking. The iteratee is bound to `thisArg` and
* invoked with one argument; (value). * invoked with one argument; (value).
* *

View File

@@ -8,7 +8,7 @@ define(['../internal/baseCallback', '../internal/baseUniq', '../internal/isItera
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons, in which only the first occurence of each element * for equality comparisons, in which only the first occurence of each element
* is kept. Providing `true` for `isSorted` performs a faster search algorithm * is kept. Providing `true` for `isSorted` performs a faster search algorithm
* for sorted arrays. If an iteratee function is provided it is invoked for * for sorted arrays. If an iteratee function is provided it's invoked for
* each element in the array to generate the criterion by which uniqueness * each element in the array to generate the criterion by which uniqueness
* is computed. The `iteratee` is bound to `thisArg` and invoked with three * is computed. The `iteratee` is bound to `thisArg` and invoked with three
* arguments: (value, index, array). * arguments: (value, index, array).

View File

@@ -27,7 +27,7 @@ define(['../internal/LazyWrapper', '../internal/LodashWrapper', './thru'], funct
var value = this.__wrapped__; var value = this.__wrapped__;
var interceptor = function(value) { var interceptor = function(value) {
return (wrapped && wrapped.__dir__ < 0) ? value : value.reverse(); return value.reverse();
}; };
if (value instanceof LazyWrapper) { if (value instanceof LazyWrapper) {
var wrapped = value; var wrapped = value;

View File

@@ -4,9 +4,9 @@ define(['../internal/baseIndexOf', '../internal/getLength', '../lang/isArray', '
var nativeMax = Math.max; var nativeMax = Math.max;
/** /**
* Checks if `value` is in `collection` using * Checks if `target` is in `collection` using
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons. If `fromIndex` is negative, it is used as the offset * for equality comparisons. If `fromIndex` is negative, it's used as the offset
* from the end of `collection`. * from the end of `collection`.
* *
* @static * @static

View File

@@ -6,7 +6,7 @@ define(['../internal/baseEach', '../internal/invokePath', '../internal/isArrayLi
/** /**
* Invokes the method at `path` of each element in `collection`, returning * Invokes the method at `path` of each element in `collection`, returning
* an array of the results of each invoked method. Any additional arguments * an array of the results of each invoked method. Any additional arguments
* are provided to each invoked method. If `methodName` is a function it is * are provided to each invoked method. If `methodName` is a function it's
* invoked for, and `this` bound to, each element in `collection`. * invoked for, and `this` bound to, each element in `collection`.
* *
* @static * @static

View File

@@ -8,7 +8,7 @@ define(['../internal/root'], function(root) {
/** /**
* The opposite of `_.before`; this method creates a function that invokes * The opposite of `_.before`; this method creates a function that invokes
* `func` once it is called `n` or more times. * `func` once it's called `n` or more times.
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -8,7 +8,7 @@ define([], function() {
/** /**
* Creates a function that invokes `func`, with the `this` binding and arguments * Creates a function that invokes `func`, with the `this` binding and arguments
* of the created function, while it is called less than `n` times. Subsequent * of the created function, while it's called less than `n` times. Subsequent
* calls to the created function return the result of the last `func` invocation. * calls to the created function return the result of the last `func` invocation.
* *
* @static * @static

View File

@@ -34,7 +34,7 @@ define(['../lang/isObject', '../date/now'], function(isObject, now) {
* @param {boolean} [options.leading=false] Specify invoking on the leading * @param {boolean} [options.leading=false] Specify invoking on the leading
* edge of the timeout. * edge of the timeout.
* @param {number} [options.maxWait] The maximum time `func` is allowed to be * @param {number} [options.maxWait] The maximum time `func` is allowed to be
* delayed before it is invoked. * delayed before it's invoked.
* @param {boolean} [options.trailing=true] Specify invoking on the trailing * @param {boolean} [options.trailing=true] Specify invoking on the trailing
* edge of the timeout. * edge of the timeout.
* @returns {Function} Returns the new debounced function. * @returns {Function} Returns the new debounced function.

View File

@@ -2,7 +2,7 @@ define(['../internal/baseDelay', './restParam'], function(baseDelay, restParam)
/** /**
* Defers invoking the `func` until the current call stack has cleared. Any * Defers invoking the `func` until the current call stack has cleared. Any
* additional arguments are provided to `func` when it is invoked. * additional arguments are provided to `func` when it's invoked.
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -2,7 +2,7 @@ define(['../internal/baseDelay', './restParam'], function(baseDelay, restParam)
/** /**
* Invokes `func` after `wait` milliseconds. Any additional arguments are * Invokes `func` after `wait` milliseconds. Any additional arguments are
* provided to `func` when it is invoked. * provided to `func` when it's invoked.
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -13,7 +13,7 @@ define([], function() {
* Creates a function that invokes `func` with the `this` binding of the * Creates a function that invokes `func` with the `this` binding of the
* created function and arguments from `start` and beyond provided as an array. * created function and arguments from `start` and beyond provided as an array.
* *
* **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters). * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -7,7 +7,7 @@ define([], function() {
* Creates a function that invokes `func` with the `this` binding of the created * Creates a function that invokes `func` with the `this` binding of the created
* function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3). * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
* *
* **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator). * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/Web/JavaScript/Reference/Operators/Spread_operator).
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -10,7 +10,7 @@ define(['./baseIndexOf', './cacheIndexOf', './createCache'], function(baseIndexO
* @private * @private
* @param {Array} array The array to inspect. * @param {Array} array The array to inspect.
* @param {Function} [iteratee] The function invoked per iteration. * @param {Function} [iteratee] The function invoked per iteration.
* @returns {Array} Returns the new duplicate-value-free array. * @returns {Array} Returns the new duplicate free array.
*/ */
function baseUniq(array, iteratee) { function baseUniq(array, iteratee) {
var index = -1, var index = -1,

View File

@@ -8,7 +8,7 @@ define(['./realNames'], function(realNames) {
* @returns {string} Returns the function name. * @returns {string} Returns the function name.
*/ */
function getFuncName(func) { function getFuncName(func) {
var result = func.name, var result = (func.name + ''),
array = realNames[result], array = realNames[result],
length = array ? array.length : 0; length = array ? array.length : 0;

View File

@@ -8,11 +8,12 @@ define(['./LazyWrapper', './getData', './getFuncName', '../chain/lodash'], funct
* @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`. * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
*/ */
function isLaziable(func) { function isLaziable(func) {
var funcName = getFuncName(func); var funcName = getFuncName(func),
if (!(funcName in LazyWrapper.prototype)) { other = lodash[funcName];
if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
return false; return false;
} }
var other = lodash[funcName];
if (func === other) { if (func === other) {
return true; return true;
} }

View File

@@ -35,7 +35,7 @@ define(['./baseWrapperValue', './getView', '../lang/isArray'], function(baseWrap
takeCount = nativeMin(length, this.__takeCount__); takeCount = nativeMin(length, this.__takeCount__);
if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) { if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) {
return baseWrapperValue((isRight && isArr) ? array.reverse() : array, this.__actions__); return baseWrapperValue(array, this.__actions__);
} }
var result = []; var result = [];

View File

@@ -7,7 +7,7 @@ define([], function() {
* @private * @private
* @param {Array} array The array to inspect. * @param {Array} array The array to inspect.
* @param {Function} [iteratee] The function invoked per iteration. * @param {Function} [iteratee] The function invoked per iteration.
* @returns {Array} Returns the new duplicate-value-free array. * @returns {Array} Returns the new duplicate free array.
*/ */
function sortedUniq(array, iteratee) { function sortedUniq(array, iteratee) {
var seen, var seen,

View File

@@ -2,10 +2,10 @@ define(['../internal/baseClone', '../internal/bindCallback', '../internal/isIter
/** /**
* Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned, * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,
* otherwise they are assigned by reference. If `customizer` is provided it is * otherwise they are assigned by reference. If `customizer` is provided it's
* invoked to produce the cloned values. If `customizer` returns `undefined` * invoked to produce the cloned values. If `customizer` returns `undefined`
* cloning is handled by the method instead. The `customizer` is bound to * cloning is handled by the method instead. The `customizer` is bound to
* `thisArg` and invoked with two argument; (value [, index|key, object]). * `thisArg` and invoked with up to three argument; (value [, index|key, object]).
* *
* **Note:** This method is loosely based on the * **Note:** This method is loosely based on the
* [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
@@ -61,7 +61,7 @@ define(['../internal/baseClone', '../internal/bindCallback', '../internal/isIter
isDeep = false; isDeep = false;
} }
return typeof customizer == 'function' return typeof customizer == 'function'
? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1)) ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 3))
: baseClone(value, isDeep); : baseClone(value, isDeep);
} }

View File

@@ -1,10 +1,10 @@
define(['../internal/baseClone', '../internal/bindCallback'], function(baseClone, bindCallback) { define(['../internal/baseClone', '../internal/bindCallback'], function(baseClone, bindCallback) {
/** /**
* Creates a deep clone of `value`. If `customizer` is provided it is invoked * Creates a deep clone of `value`. If `customizer` is provided it's invoked
* to produce the cloned values. If `customizer` returns `undefined` cloning * to produce the cloned values. If `customizer` returns `undefined` cloning
* is handled by the method instead. The `customizer` is bound to `thisArg` * is handled by the method instead. The `customizer` is bound to `thisArg`
* and invoked with two argument; (value [, index|key, object]). * and invoked with up to three argument; (value [, index|key, object]).
* *
* **Note:** This method is loosely based on the * **Note:** This method is loosely based on the
* [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
@@ -47,7 +47,7 @@ define(['../internal/baseClone', '../internal/bindCallback'], function(baseClone
*/ */
function cloneDeep(value, customizer, thisArg) { function cloneDeep(value, customizer, thisArg) {
return typeof customizer == 'function' return typeof customizer == 'function'
? baseClone(value, true, bindCallback(customizer, thisArg, 1)) ? baseClone(value, true, bindCallback(customizer, thisArg, 3))
: baseClone(value, true); : baseClone(value, true);
} }

View File

@@ -1,7 +1,7 @@
define(['./isArguments', './isArray', '../internal/isArrayLike', './isFunction', '../internal/isObjectLike', './isString', '../object/keys'], function(isArguments, isArray, isArrayLike, isFunction, isObjectLike, isString, keys) { define(['./isArguments', './isArray', '../internal/isArrayLike', './isFunction', '../internal/isObjectLike', './isString', '../object/keys'], function(isArguments, isArray, isArrayLike, isFunction, isObjectLike, isString, keys) {
/** /**
* Checks if `value` is empty. A value is considered empty unless it is an * Checks if `value` is empty. A value is considered empty unless it's an
* `arguments` object, array, string, or jQuery-like collection with a length * `arguments` object, array, string, or jQuery-like collection with a length
* greater than `0` or an object with own enumerable properties. * greater than `0` or an object with own enumerable properties.
* *

View File

@@ -5,10 +5,10 @@ define(['../internal/baseIsEqual', '../internal/bindCallback'], function(baseIsE
/** /**
* Performs a deep comparison between two values to determine if they are * Performs a deep comparison between two values to determine if they are
* equivalent. If `customizer` is provided it is invoked to compare values. * equivalent. If `customizer` is provided it's invoked to compare values.
* If `customizer` returns `undefined` comparisons are handled by the method * If `customizer` returns `undefined` comparisons are handled by the method
* instead. The `customizer` is bound to `thisArg` and invoked with three * instead. The `customizer` is bound to `thisArg` and invoked with up to
* arguments: (value, other [, index|key]). * three arguments: (value, other [, index|key]).
* *
* **Note:** This method supports comparing arrays, booleans, `Date` objects, * **Note:** This method supports comparing arrays, booleans, `Date` objects,
* numbers, `Object` objects, regexes, and strings. Objects are compared by * numbers, `Object` objects, regexes, and strings. Objects are compared by

View File

@@ -31,7 +31,7 @@ define(['./isObject'], function(isObject) {
function isFunction(value) { function isFunction(value) {
// The use of `Object#toString` avoids issues with the `typeof` operator // The use of `Object#toString` avoids issues with the `typeof` operator
// in older versions of Chrome and Safari which return 'function' for regexes // in older versions of Chrome and Safari which return 'function' for regexes
// and Safari 8 equivalents which return 'object' for typed array constructors. // and Safari 8 which returns 'object' for typed array constructors.
return isObject(value) && objToString.call(value) == funcTag; return isObject(value) && objToString.call(value) == funcTag;
} }

View File

@@ -6,7 +6,7 @@ define(['../internal/baseIsMatch', '../internal/bindCallback', '../internal/getM
/** /**
* Performs a deep comparison between `object` and `source` to determine if * Performs a deep comparison between `object` and `source` to determine if
* `object` contains equivalent property values. If `customizer` is provided * `object` contains equivalent property values. If `customizer` is provided
* it is invoked to compare values. If `customizer` returns `undefined` * it's invoked to compare values. If `customizer` returns `undefined`
* comparisons are handled by the method instead. The `customizer` is bound * comparisons are handled by the method instead. The `customizer` is bound
* to `thisArg` and invoked with three arguments: (value, other, index|key). * to `thisArg` and invoked with three arguments: (value, other, index|key).
* *

107
main.js
View File

@@ -1,6 +1,6 @@
/** /**
* @license * @license
* lodash 3.10.0 (Custom Build) <https://lodash.com/> * lodash 3.10.1 (Custom Build) <https://lodash.com/>
* Build: `lodash modern exports="amd" -d -o ./main.js` * Build: `lodash modern exports="amd" -d -o ./main.js`
* Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/> * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
@@ -13,7 +13,7 @@
var undefined; var undefined;
/** Used as the semantic version number. */ /** Used as the semantic version number. */
var VERSION = '3.10.0'; var VERSION = '3.10.1';
/** Used to compose bitmasks for wrapper metadata. */ /** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1, var BIND_FLAG = 1,
@@ -592,7 +592,7 @@
* @private * @private
* @param {Array} array The array to inspect. * @param {Array} array The array to inspect.
* @param {Function} [iteratee] The function invoked per iteration. * @param {Function} [iteratee] The function invoked per iteration.
* @returns {Array} Returns the new duplicate-value-free array. * @returns {Array} Returns the new duplicate free array.
*/ */
function sortedUniq(array, iteratee) { function sortedUniq(array, iteratee) {
var seen, var seen,
@@ -1071,7 +1071,7 @@
takeCount = nativeMin(length, this.__takeCount__); takeCount = nativeMin(length, this.__takeCount__);
if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) { if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) {
return baseWrapperValue((isRight && isArr) ? array.reverse() : array, this.__actions__); return baseWrapperValue(array, this.__actions__);
} }
var result = []; var result = [];
@@ -1788,7 +1788,7 @@
} }
var index = -1, var index = -1,
indexOf = getIndexOf(), indexOf = getIndexOf(),
isCommon = indexOf == baseIndexOf, isCommon = indexOf === baseIndexOf,
cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null, cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null,
valuesLength = values.length; valuesLength = values.length;
@@ -2655,13 +2655,13 @@
* @private * @private
* @param {Array} array The array to inspect. * @param {Array} array The array to inspect.
* @param {Function} [iteratee] The function invoked per iteration. * @param {Function} [iteratee] The function invoked per iteration.
* @returns {Array} Returns the new duplicate-value-free array. * @returns {Array} Returns the new duplicate free array.
*/ */
function baseUniq(array, iteratee) { function baseUniq(array, iteratee) {
var index = -1, var index = -1,
indexOf = getIndexOf(), indexOf = getIndexOf(),
length = array.length, length = array.length,
isCommon = indexOf == baseIndexOf, isCommon = indexOf === baseIndexOf,
isLarge = isCommon && length >= LARGE_ARRAY_SIZE, isLarge = isCommon && length >= LARGE_ARRAY_SIZE,
seen = isLarge ? createCache() : null, seen = isLarge ? createCache() : null,
result = []; result = [];
@@ -3870,7 +3870,7 @@
* @returns {string} Returns the function name. * @returns {string} Returns the function name.
*/ */
function getFuncName(func) { function getFuncName(func) {
var result = func.name, var result = (func.name + ''),
array = realNames[result], array = realNames[result],
length = array ? array.length : 0; length = array ? array.length : 0;
@@ -4137,11 +4137,12 @@
* @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`. * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
*/ */
function isLaziable(func) { function isLaziable(func) {
var funcName = getFuncName(func); var funcName = getFuncName(func),
if (!(funcName in LazyWrapper.prototype)) { other = lodash[funcName];
if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
return false; return false;
} }
var other = lodash[funcName];
if (func === other) { if (func === other) {
return true; return true;
} }
@@ -4876,7 +4877,7 @@
/** /**
* Flattens a nested array. If `isDeep` is `true` the array is recursively * Flattens a nested array. If `isDeep` is `true` the array is recursively
* flattened, otherwise it is only flattened a single level. * flattened, otherwise it's only flattened a single level.
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -4923,7 +4924,7 @@
/** /**
* Gets the index at which the first occurrence of `value` is found in `array` * Gets the index at which the first occurrence of `value` is found in `array`
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons. If `fromIndex` is negative, it is used as the offset * for equality comparisons. If `fromIndex` is negative, it's used as the offset
* from the end of `array`. If `array` is sorted providing `true` for `fromIndex` * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
* performs a faster binary search. * performs a faster binary search.
* *
@@ -5002,7 +5003,7 @@
othIndex = othLength, othIndex = othLength,
caches = Array(length), caches = Array(length),
indexOf = getIndexOf(), indexOf = getIndexOf(),
isCommon = indexOf == baseIndexOf, isCommon = indexOf === baseIndexOf,
result = []; result = [];
while (othIndex--) { while (othIndex--) {
@@ -5287,7 +5288,7 @@
/** /**
* Uses a binary search to determine the lowest index at which `value` should * Uses a binary search to determine the lowest index at which `value` should
* be inserted into `array` in order to maintain its sort order. If an iteratee * be inserted into `array` in order to maintain its sort order. If an iteratee
* function is provided it is invoked for `value` and each element of `array` * function is provided it's invoked for `value` and each element of `array`
* to compute their sort ranking. The iteratee is bound to `thisArg` and * to compute their sort ranking. The iteratee is bound to `thisArg` and
* invoked with one argument; (value). * invoked with one argument; (value).
* *
@@ -5561,7 +5562,7 @@
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons, in which only the first occurence of each element * for equality comparisons, in which only the first occurence of each element
* is kept. Providing `true` for `isSorted` performs a faster search algorithm * is kept. Providing `true` for `isSorted` performs a faster search algorithm
* for sorted arrays. If an iteratee function is provided it is invoked for * for sorted arrays. If an iteratee function is provided it's invoked for
* each element in the array to generate the criterion by which uniqueness * each element in the array to generate the criterion by which uniqueness
* is computed. The `iteratee` is bound to `thisArg` and invoked with three * is computed. The `iteratee` is bound to `thisArg` and invoked with three
* arguments: (value, index, array). * arguments: (value, index, array).
@@ -5619,7 +5620,7 @@
if (!(iteratee == null && callback === baseCallback)) { if (!(iteratee == null && callback === baseCallback)) {
iteratee = callback(iteratee, thisArg, 3); iteratee = callback(iteratee, thisArg, 3);
} }
return (isSorted && getIndexOf() == baseIndexOf) return (isSorted && getIndexOf() === baseIndexOf)
? sortedUniq(array, iteratee) ? sortedUniq(array, iteratee)
: baseUniq(array, iteratee); : baseUniq(array, iteratee);
} }
@@ -6074,7 +6075,7 @@
var value = this.__wrapped__; var value = this.__wrapped__;
var interceptor = function(value) { var interceptor = function(value) {
return (wrapped && wrapped.__dir__ < 0) ? value : value.reverse(); return value.reverse();
}; };
if (value instanceof LazyWrapper) { if (value instanceof LazyWrapper) {
var wrapped = value; var wrapped = value;
@@ -6516,9 +6517,9 @@
}); });
/** /**
* Checks if `value` is in `collection` using * Checks if `target` is in `collection` using
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
* for equality comparisons. If `fromIndex` is negative, it is used as the offset * for equality comparisons. If `fromIndex` is negative, it's used as the offset
* from the end of `collection`. * from the end of `collection`.
* *
* @static * @static
@@ -6613,7 +6614,7 @@
/** /**
* Invokes the method at `path` of each element in `collection`, returning * Invokes the method at `path` of each element in `collection`, returning
* an array of the results of each invoked method. Any additional arguments * an array of the results of each invoked method. Any additional arguments
* are provided to each invoked method. If `methodName` is a function it is * are provided to each invoked method. If `methodName` is a function it's
* invoked for, and `this` bound to, each element in `collection`. * invoked for, and `this` bound to, each element in `collection`.
* *
* @static * @static
@@ -7265,7 +7266,7 @@
/** /**
* The opposite of `_.before`; this method creates a function that invokes * The opposite of `_.before`; this method creates a function that invokes
* `func` once it is called `n` or more times. * `func` once it's called `n` or more times.
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -7330,7 +7331,7 @@
/** /**
* Creates a function that invokes `func`, with the `this` binding and arguments * Creates a function that invokes `func`, with the `this` binding and arguments
* of the created function, while it is called less than `n` times. Subsequent * of the created function, while it's called less than `n` times. Subsequent
* calls to the created function return the result of the last `func` invocation. * calls to the created function return the result of the last `func` invocation.
* *
* @static * @static
@@ -7610,7 +7611,7 @@
* @param {boolean} [options.leading=false] Specify invoking on the leading * @param {boolean} [options.leading=false] Specify invoking on the leading
* edge of the timeout. * edge of the timeout.
* @param {number} [options.maxWait] The maximum time `func` is allowed to be * @param {number} [options.maxWait] The maximum time `func` is allowed to be
* delayed before it is invoked. * delayed before it's invoked.
* @param {boolean} [options.trailing=true] Specify invoking on the trailing * @param {boolean} [options.trailing=true] Specify invoking on the trailing
* edge of the timeout. * edge of the timeout.
* @returns {Function} Returns the new debounced function. * @returns {Function} Returns the new debounced function.
@@ -7758,7 +7759,7 @@
/** /**
* Defers invoking the `func` until the current call stack has cleared. Any * Defers invoking the `func` until the current call stack has cleared. Any
* additional arguments are provided to `func` when it is invoked. * additional arguments are provided to `func` when it's invoked.
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -7779,7 +7780,7 @@
/** /**
* Invokes `func` after `wait` milliseconds. Any additional arguments are * Invokes `func` after `wait` milliseconds. Any additional arguments are
* provided to `func` when it is invoked. * provided to `func` when it's invoked.
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -8112,7 +8113,7 @@
* Creates a function that invokes `func` with the `this` binding of the * Creates a function that invokes `func` with the `this` binding of the
* created function and arguments from `start` and beyond provided as an array. * created function and arguments from `start` and beyond provided as an array.
* *
* **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters). * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -8163,7 +8164,7 @@
* Creates a function that invokes `func` with the `this` binding of the created * Creates a function that invokes `func` with the `this` binding of the created
* function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3). * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
* *
* **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator). * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/Web/JavaScript/Reference/Operators/Spread_operator).
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -8284,10 +8285,10 @@
/** /**
* Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned, * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,
* otherwise they are assigned by reference. If `customizer` is provided it is * otherwise they are assigned by reference. If `customizer` is provided it's
* invoked to produce the cloned values. If `customizer` returns `undefined` * invoked to produce the cloned values. If `customizer` returns `undefined`
* cloning is handled by the method instead. The `customizer` is bound to * cloning is handled by the method instead. The `customizer` is bound to
* `thisArg` and invoked with two argument; (value [, index|key, object]). * `thisArg` and invoked with up to three argument; (value [, index|key, object]).
* *
* **Note:** This method is loosely based on the * **Note:** This method is loosely based on the
* [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
@@ -8343,15 +8344,15 @@
isDeep = false; isDeep = false;
} }
return typeof customizer == 'function' return typeof customizer == 'function'
? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1)) ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 3))
: baseClone(value, isDeep); : baseClone(value, isDeep);
} }
/** /**
* Creates a deep clone of `value`. If `customizer` is provided it is invoked * Creates a deep clone of `value`. If `customizer` is provided it's invoked
* to produce the cloned values. If `customizer` returns `undefined` cloning * to produce the cloned values. If `customizer` returns `undefined` cloning
* is handled by the method instead. The `customizer` is bound to `thisArg` * is handled by the method instead. The `customizer` is bound to `thisArg`
* and invoked with two argument; (value [, index|key, object]). * and invoked with up to three argument; (value [, index|key, object]).
* *
* **Note:** This method is loosely based on the * **Note:** This method is loosely based on the
* [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
@@ -8394,7 +8395,7 @@
*/ */
function cloneDeep(value, customizer, thisArg) { function cloneDeep(value, customizer, thisArg) {
return typeof customizer == 'function' return typeof customizer == 'function'
? baseClone(value, true, bindCallback(customizer, thisArg, 1)) ? baseClone(value, true, bindCallback(customizer, thisArg, 3))
: baseClone(value, true); : baseClone(value, true);
} }
@@ -8548,7 +8549,7 @@
} }
/** /**
* Checks if `value` is empty. A value is considered empty unless it is an * Checks if `value` is empty. A value is considered empty unless it's an
* `arguments` object, array, string, or jQuery-like collection with a length * `arguments` object, array, string, or jQuery-like collection with a length
* greater than `0` or an object with own enumerable properties. * greater than `0` or an object with own enumerable properties.
* *
@@ -8587,10 +8588,10 @@
/** /**
* Performs a deep comparison between two values to determine if they are * Performs a deep comparison between two values to determine if they are
* equivalent. If `customizer` is provided it is invoked to compare values. * equivalent. If `customizer` is provided it's invoked to compare values.
* If `customizer` returns `undefined` comparisons are handled by the method * If `customizer` returns `undefined` comparisons are handled by the method
* instead. The `customizer` is bound to `thisArg` and invoked with three * instead. The `customizer` is bound to `thisArg` and invoked with up to
* arguments: (value, other [, index|key]). * three arguments: (value, other [, index|key]).
* *
* **Note:** This method supports comparing arrays, booleans, `Date` objects, * **Note:** This method supports comparing arrays, booleans, `Date` objects,
* numbers, `Object` objects, regexes, and strings. Objects are compared by * numbers, `Object` objects, regexes, and strings. Objects are compared by
@@ -8706,7 +8707,7 @@
function isFunction(value) { function isFunction(value) {
// The use of `Object#toString` avoids issues with the `typeof` operator // The use of `Object#toString` avoids issues with the `typeof` operator
// in older versions of Chrome and Safari which return 'function' for regexes // in older versions of Chrome and Safari which return 'function' for regexes
// and Safari 8 equivalents which return 'object' for typed array constructors. // and Safari 8 which returns 'object' for typed array constructors.
return isObject(value) && objToString.call(value) == funcTag; return isObject(value) && objToString.call(value) == funcTag;
} }
@@ -8740,7 +8741,7 @@
/** /**
* Performs a deep comparison between `object` and `source` to determine if * Performs a deep comparison between `object` and `source` to determine if
* `object` contains equivalent property values. If `customizer` is provided * `object` contains equivalent property values. If `customizer` is provided
* it is invoked to compare values. If `customizer` returns `undefined` * it's invoked to compare values. If `customizer` returns `undefined`
* comparisons are handled by the method instead. The `customizer` is bound * comparisons are handled by the method instead. The `customizer` is bound
* to `thisArg` and invoked with three arguments: (value, other, index|key). * to `thisArg` and invoked with three arguments: (value, other, index|key).
* *
@@ -9122,7 +9123,7 @@
* Recursively merges own enumerable properties of the source object(s), that * Recursively merges own enumerable properties of the source object(s), that
* don't resolve to `undefined` into the destination object. Subsequent sources * don't resolve to `undefined` into the destination object. Subsequent sources
* overwrite property assignments of previous sources. If `customizer` is * overwrite property assignments of previous sources. If `customizer` is
* provided it is invoked to produce the merged values of the destination and * provided it's invoked to produce the merged values of the destination and
* source properties. If `customizer` returns `undefined` merging is handled * source properties. If `customizer` returns `undefined` merging is handled
* by the method instead. The `customizer` is bound to `thisArg` and invoked * by the method instead. The `customizer` is bound to `thisArg` and invoked
* with five arguments: (objectValue, sourceValue, key, object, source). * with five arguments: (objectValue, sourceValue, key, object, source).
@@ -9171,7 +9172,7 @@
/** /**
* Assigns own enumerable properties of source object(s) to the destination * Assigns own enumerable properties of source object(s) to the destination
* object. Subsequent sources overwrite property assignments of previous sources. * object. Subsequent sources overwrite property assignments of previous sources.
* If `customizer` is provided it is invoked to produce the assigned values. * If `customizer` is provided it's invoked to produce the assigned values.
* The `customizer` is bound to `thisArg` and invoked with five arguments: * The `customizer` is bound to `thisArg` and invoked with five arguments:
* (objectValue, sourceValue, key, object, source). * (objectValue, sourceValue, key, object, source).
* *
@@ -9544,7 +9545,7 @@
* // => 'default' * // => 'default'
*/ */
function get(object, path, defaultValue) { function get(object, path, defaultValue) {
var result = object == null ? undefined : baseGet(object, toPath(path), path + ''); var result = object == null ? undefined : baseGet(object, toPath(path), (path + ''));
return result === undefined ? defaultValue : result; return result === undefined ? defaultValue : result;
} }
@@ -9859,7 +9860,7 @@
/** /**
* Creates an object composed of the picked `object` properties. Property * Creates an object composed of the picked `object` properties. Property
* names may be specified as individual arguments or as arrays of property * names may be specified as individual arguments or as arrays of property
* names. If `predicate` is provided it is invoked for each property of `object` * names. If `predicate` is provided it's invoked for each property of `object`
* picking the properties `predicate` returns truthy for. The predicate is * picking the properties `predicate` returns truthy for. The predicate is
* bound to `thisArg` and invoked with three arguments: (value, key, object). * bound to `thisArg` and invoked with three arguments: (value, key, object).
* *
@@ -9893,7 +9894,7 @@
/** /**
* This method is like `_.get` except that if the resolved value is a function * This method is like `_.get` except that if the resolved value is a function
* it is invoked with the `this` binding of its parent object and its result * it's invoked with the `this` binding of its parent object and its result
* is returned. * is returned.
* *
* @static * @static
@@ -9934,7 +9935,7 @@
/** /**
* Sets the property value of `path` on `object`. If a portion of `path` * Sets the property value of `path` on `object`. If a portion of `path`
* does not exist it is created. * does not exist it's created.
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -10092,7 +10093,7 @@
/** /**
* Checks if `n` is between `start` and up to but not including, `end`. If * Checks if `n` is between `start` and up to but not including, `end`. If
* `end` is not specified it is set to `start` with `start` then set to `0`. * `end` is not specified it's set to `start` with `start` then set to `0`.
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -11056,7 +11057,7 @@
/** /**
* Attempts to invoke `func`, returning either the result or the caught error * Attempts to invoke `func`, returning either the result or the caught error
* object. Any additional arguments are provided to `func` when it is invoked. * object. Any additional arguments are provided to `func` when it's invoked.
* *
* @static * @static
* @memberOf _ * @memberOf _
@@ -11454,13 +11455,13 @@
*/ */
function propertyOf(object) { function propertyOf(object) {
return function(path) { return function(path) {
return baseGet(object, toPath(path), path + ''); return baseGet(object, toPath(path), (path + ''));
}; };
} }
/** /**
* Creates an array of numbers (positive and/or negative) progressing from * Creates an array of numbers (positive and/or negative) progressing from
* `start` up to, but not including, `end`. If `end` is not specified it is * `start` up to, but not including, `end`. If `end` is not specified it's
* set to `start` with `start` then set to `0`. If `end` is less than `start` * set to `start` with `start` then set to `0`. If `end` is less than `start`
* a zero-length range is created unless a negative `step` is specified. * a zero-length range is created unless a negative `step` is specified.
* *
@@ -11653,7 +11654,7 @@
/** /**
* Gets the maximum value of `collection`. If `collection` is empty or falsey * Gets the maximum value of `collection`. If `collection` is empty or falsey
* `-Infinity` is returned. If an iteratee function is provided it is invoked * `-Infinity` is returned. If an iteratee function is provided it's invoked
* for each value in `collection` to generate the criterion by which the value * for each value in `collection` to generate the criterion by which the value
* is ranked. The `iteratee` is bound to `thisArg` and invoked with three * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
* arguments: (value, index, collection). * arguments: (value, index, collection).
@@ -11702,7 +11703,7 @@
/** /**
* Gets the minimum value of `collection`. If `collection` is empty or falsey * Gets the minimum value of `collection`. If `collection` is empty or falsey
* `Infinity` is returned. If an iteratee function is provided it is invoked * `Infinity` is returned. If an iteratee function is provided it's invoked
* for each value in `collection` to generate the criterion by which the value * for each value in `collection` to generate the criterion by which the value
* is ranked. The `iteratee` is bound to `thisArg` and invoked with three * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
* arguments: (value, index, collection). * arguments: (value, index, collection).
@@ -12279,7 +12280,7 @@
baseForOwn(LazyWrapper.prototype, function(func, methodName) { baseForOwn(LazyWrapper.prototype, function(func, methodName) {
var lodashFunc = lodash[methodName]; var lodashFunc = lodash[methodName];
if (lodashFunc) { if (lodashFunc) {
var key = lodashFunc.name, var key = (lodashFunc.name + ''),
names = realNames[key] || (realNames[key] = []); names = realNames[key] || (realNames[key] = []);
names.push({ 'name': methodName, 'func': lodashFunc }); names.push({ 'name': methodName, 'func': lodashFunc });

View File

@@ -5,7 +5,7 @@ define(['../internal/createExtremum', '../lang/gt'], function(createExtremum, gt
/** /**
* Gets the maximum value of `collection`. If `collection` is empty or falsey * Gets the maximum value of `collection`. If `collection` is empty or falsey
* `-Infinity` is returned. If an iteratee function is provided it is invoked * `-Infinity` is returned. If an iteratee function is provided it's invoked
* for each value in `collection` to generate the criterion by which the value * for each value in `collection` to generate the criterion by which the value
* is ranked. The `iteratee` is bound to `thisArg` and invoked with three * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
* arguments: (value, index, collection). * arguments: (value, index, collection).

View File

@@ -5,7 +5,7 @@ define(['../internal/createExtremum', '../lang/lt'], function(createExtremum, lt
/** /**
* Gets the minimum value of `collection`. If `collection` is empty or falsey * Gets the minimum value of `collection`. If `collection` is empty or falsey
* `Infinity` is returned. If an iteratee function is provided it is invoked * `Infinity` is returned. If an iteratee function is provided it's invoked
* for each value in `collection` to generate the criterion by which the value * for each value in `collection` to generate the criterion by which the value
* is ranked. The `iteratee` is bound to `thisArg` and invoked with three * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
* arguments: (value, index, collection). * arguments: (value, index, collection).

View File

@@ -9,7 +9,7 @@ define([], function() {
/** /**
* Checks if `n` is between `start` and up to but not including, `end`. If * Checks if `n` is between `start` and up to but not including, `end`. If
* `end` is not specified it is set to `start` with `start` then set to `0`. * `end` is not specified it's set to `start` with `start` then set to `0`.
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -3,7 +3,7 @@ define(['../internal/assignWith', '../internal/baseAssign', '../internal/createA
/** /**
* Assigns own enumerable properties of source object(s) to the destination * Assigns own enumerable properties of source object(s) to the destination
* object. Subsequent sources overwrite property assignments of previous sources. * object. Subsequent sources overwrite property assignments of previous sources.
* If `customizer` is provided it is invoked to produce the assigned values. * If `customizer` is provided it's invoked to produce the assigned values.
* The `customizer` is bound to `thisArg` and invoked with five arguments: * The `customizer` is bound to `thisArg` and invoked with five arguments:
* (objectValue, sourceValue, key, object, source). * (objectValue, sourceValue, key, object, source).
* *

View File

@@ -28,7 +28,7 @@ define(['../internal/baseGet', '../internal/toPath'], function(baseGet, toPath)
* // => 'default' * // => 'default'
*/ */
function get(object, path, defaultValue) { function get(object, path, defaultValue) {
var result = object == null ? undefined : baseGet(object, toPath(path), path + ''); var result = object == null ? undefined : baseGet(object, toPath(path), (path + ''));
return result === undefined ? defaultValue : result; return result === undefined ? defaultValue : result;
} }

View File

@@ -4,7 +4,7 @@ define(['../internal/baseMerge', '../internal/createAssigner'], function(baseMer
* Recursively merges own enumerable properties of the source object(s), that * Recursively merges own enumerable properties of the source object(s), that
* don't resolve to `undefined` into the destination object. Subsequent sources * don't resolve to `undefined` into the destination object. Subsequent sources
* overwrite property assignments of previous sources. If `customizer` is * overwrite property assignments of previous sources. If `customizer` is
* provided it is invoked to produce the merged values of the destination and * provided it's invoked to produce the merged values of the destination and
* source properties. If `customizer` returns `undefined` merging is handled * source properties. If `customizer` returns `undefined` merging is handled
* by the method instead. The `customizer` is bound to `thisArg` and invoked * by the method instead. The `customizer` is bound to `thisArg` and invoked
* with five arguments: (objectValue, sourceValue, key, object, source). * with five arguments: (objectValue, sourceValue, key, object, source).

View File

@@ -3,7 +3,7 @@ define(['../internal/baseFlatten', '../internal/bindCallback', '../internal/pick
/** /**
* Creates an object composed of the picked `object` properties. Property * Creates an object composed of the picked `object` properties. Property
* names may be specified as individual arguments or as arrays of property * names may be specified as individual arguments or as arrays of property
* names. If `predicate` is provided it is invoked for each property of `object` * names. If `predicate` is provided it's invoked for each property of `object`
* picking the properties `predicate` returns truthy for. The predicate is * picking the properties `predicate` returns truthy for. The predicate is
* bound to `thisArg` and invoked with three arguments: (value, key, object). * bound to `thisArg` and invoked with three arguments: (value, key, object).
* *

View File

@@ -5,7 +5,7 @@ define(['../internal/baseGet', '../internal/baseSlice', '../lang/isFunction', '.
/** /**
* This method is like `_.get` except that if the resolved value is a function * This method is like `_.get` except that if the resolved value is a function
* it is invoked with the `this` binding of its parent object and its result * it's invoked with the `this` binding of its parent object and its result
* is returned. * is returned.
* *
* @static * @static

View File

@@ -2,7 +2,7 @@ define(['../internal/isIndex', '../internal/isKey', '../lang/isObject', '../inte
/** /**
* Sets the property value of `path` on `object`. If a portion of `path` * Sets the property value of `path` on `object`. If a portion of `path`
* does not exist it is created. * does not exist it's created.
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -1,6 +1,6 @@
{ {
"name": "lodash", "name": "lodash",
"version": "3.10.0", "version": "3.10.1",
"main": "main.js", "main": "main.js",
"private": true, "private": true,
"volo": { "volo": {

View File

@@ -5,7 +5,7 @@ define(['../lang/isError', '../function/restParam'], function(isError, restParam
/** /**
* Attempts to invoke `func`, returning either the result or the caught error * Attempts to invoke `func`, returning either the result or the caught error
* object. Any additional arguments are provided to `func` when it is invoked. * object. Any additional arguments are provided to `func` when it's invoked.
* *
* @static * @static
* @memberOf _ * @memberOf _

View File

@@ -22,7 +22,7 @@ define(['../internal/baseGet', '../internal/toPath'], function(baseGet, toPath)
*/ */
function propertyOf(object) { function propertyOf(object) {
return function(path) { return function(path) {
return baseGet(object, toPath(path), path + ''); return baseGet(object, toPath(path), (path + ''));
}; };
} }

View File

@@ -9,7 +9,7 @@ define(['../internal/isIterateeCall'], function(isIterateeCall) {
/** /**
* Creates an array of numbers (positive and/or negative) progressing from * Creates an array of numbers (positive and/or negative) progressing from
* `start` up to, but not including, `end`. If `end` is not specified it is * `start` up to, but not including, `end`. If `end` is not specified it's
* set to `start` with `start` then set to `0`. If `end` is less than `start` * set to `start` with `start` then set to `0`. If `end` is less than `start`
* a zero-length range is created unless a negative `step` is specified. * a zero-length range is created unless a negative `step` is specified.
* *