lodash-rails 3.3.1.1 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b2f5900e83d94e3b74016db9d8279ba4db651fd
4
- data.tar.gz: b37908557935466812432048e992d02005478d17
3
+ metadata.gz: 21b069cdb16cd8e8562f886f91e344dfef771236
4
+ data.tar.gz: b713547f4af4d8a245ae0a470e72a50d7d7dce61
5
5
  SHA512:
6
- metadata.gz: 4cf2f6c48066ab3bb26b824f3f021a4161b68d0d92adb540171fa70cc8df2e17cb2d52d06fa9a7024cd9d0fa59213b11ee6d0c62416a2824d0193fdb90bc2dce
7
- data.tar.gz: 135c46cd3cd6d66015413aebf299240a8bc9c2c67af3424e041e7c4b92a5157bb44c6a3d89cb86965eea313ab1b0e7159909489b065b9b5e9b800e67fd86de7d
6
+ metadata.gz: d5f068d7d6704cc08d9b38d7af73a91dbf83c31765cf18a4f972da513ab613327912ba78c6fb9dbec43874d37469e3276ed977a74f13a57d87c11887c53a2e5d
7
+ data.tar.gz: 3229009d0eacc36987a4df3bb1c7790d9d76b3c12e41ca2ec78c191cec68d8c1fca274b7bf173f4623cd4d034a89695bc85a2096c14c30e8ac5e280e87ddaa04
data/README.md CHANGED
@@ -18,7 +18,7 @@ Add the necessary library to `app/assets/javascripts/application.js`:
18
18
 
19
19
  ## What's included?
20
20
 
21
- lodash 3.3.1:
21
+ lodash 3.4.0:
22
22
 
23
23
  * lodash.js
24
24
  * lodash.min.js
@@ -1,5 +1,5 @@
1
1
  module LoDash
2
2
  module Rails
3
- VERSION = "3.3.1.1"
3
+ VERSION = "3.4.0"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * lodash 3.3.1 (Custom Build) <https://lodash.com/>
3
+ * lodash 3.4.0 (Custom Build) <https://lodash.com/>
4
4
  * Build: `lodash compat -o ./lodash.js`
5
5
  * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
6
6
  * Based on Underscore.js 1.8.2 <http://underscorejs.org/LICENSE>
@@ -13,7 +13,7 @@
13
13
  var undefined;
14
14
 
15
15
  /** Used as the semantic version number. */
16
- var VERSION = '3.3.1';
16
+ var VERSION = '3.4.0';
17
17
 
18
18
  /** Used to compose bitmasks for wrapper metadata. */
19
19
  var BIND_FLAG = 1,
@@ -35,9 +35,9 @@
35
35
  HOT_SPAN = 16;
36
36
 
37
37
  /** Used to indicate the type of lazy iteratees. */
38
- var LAZY_FILTER_FLAG = 0,
39
- LAZY_MAP_FLAG = 1,
40
- LAZY_WHILE_FLAG = 2;
38
+ var LAZY_DROP_WHILE_FLAG = 0,
39
+ LAZY_MAP_FLAG = 2,
40
+ LAZY_TAKE_WHILE_FLAG = 3;
41
41
 
42
42
  /** Used as the `TypeError` message for "Functions" methods. */
43
43
  var FUNC_ERROR_TEXT = 'Expected a function';
@@ -131,7 +131,7 @@
131
131
  var upper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]',
132
132
  lower = '[a-z\\xdf-\\xf6\\xf8-\\xff]+';
133
133
 
134
- return RegExp(upper + '{2,}(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');
134
+ return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');
135
135
  }());
136
136
 
137
137
  /** Used to detect and test for whitespace. */
@@ -259,29 +259,29 @@
259
259
  '\u2029': 'u2029'
260
260
  };
261
261
 
262
- /**
263
- * Used as a reference to the global object.
264
- *
265
- * The `this` value is used if it is the global object to avoid Greasemonkey's
266
- * restricted `window` object, otherwise the `window` object is used.
267
- */
268
- var root = (objectTypes[typeof window] && window !== (this && this.window)) ? window : this;
269
-
270
262
  /** Detect free variable `exports`. */
271
263
  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
272
264
 
273
265
  /** Detect free variable `module`. */
274
266
  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
275
267
 
276
- /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */
268
+ /** Detect free variable `global` from Node.js. */
277
269
  var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;
278
- if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) {
279
- root = freeGlobal;
280
- }
270
+
271
+ /** Detect free variable `window`. */
272
+ var freeWindow = objectTypes[typeof window] && window;
281
273
 
282
274
  /** Detect the popular CommonJS extension `module.exports`. */
283
275
  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
284
276
 
277
+ /**
278
+ * Used as a reference to the global object.
279
+ *
280
+ * The `this` value is used if it is the global object to avoid Greasemonkey's
281
+ * restricted `window` object, otherwise the `window` object is used.
282
+ */
283
+ var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || this;
284
+
285
285
  /*--------------------------------------------------------------------------*/
286
286
 
287
287
  /**
@@ -314,14 +314,14 @@
314
314
  * @private
315
315
  * @param {Array} array The array to search.
316
316
  * @param {*} value The value to search for.
317
- * @param {number} [fromIndex=0] The index to search from.
317
+ * @param {number} fromIndex The index to search from.
318
318
  * @returns {number} Returns the index of the matched value, else `-1`.
319
319
  */
320
320
  function baseIndexOf(array, value, fromIndex) {
321
321
  if (value !== value) {
322
322
  return indexOfNaN(array, fromIndex);
323
323
  }
324
- var index = (fromIndex || 0) - 1,
324
+ var index = fromIndex - 1,
325
325
  length = array.length;
326
326
 
327
327
  while (++index < length) {
@@ -346,26 +346,6 @@
346
346
  return typeof value == 'function' || false;
347
347
  }
348
348
 
349
- /**
350
- * The base implementation of `_.sortBy` and `_.sortByAll` which uses `comparer`
351
- * to define the sort order of `array` and replaces criteria objects with their
352
- * corresponding values.
353
- *
354
- * @private
355
- * @param {Array} array The array to sort.
356
- * @param {Function} comparer The function to define sort order.
357
- * @returns {Array} Returns `array`.
358
- */
359
- function baseSortBy(array, comparer) {
360
- var length = array.length;
361
-
362
- array.sort(comparer);
363
- while (length--) {
364
- array[length] = array[length].value;
365
- }
366
- return array;
367
- }
368
-
369
349
  /**
370
350
  * Converts `value` to a string if it is not one. An empty string is returned
371
351
  * for `null` or `undefined` values.
@@ -439,24 +419,34 @@
439
419
  }
440
420
 
441
421
  /**
442
- * Used by `_.sortByAll` to compare multiple properties of each element
443
- * in a collection and stable sort them in ascending order.
422
+ * Used by `_.sortByOrder` to compare multiple properties of each element
423
+ * in a collection and stable sort them in the following order:
424
+ *
425
+ * If orders is unspecified, sort in ascending order for all properties.
426
+ * Otherwise, for each property, sort in ascending order if its corresponding value in
427
+ * orders is true, and descending order if false.
444
428
  *
445
429
  * @private
446
430
  * @param {Object} object The object to compare to `other`.
447
431
  * @param {Object} other The object to compare to `object`.
432
+ * @param {boolean[]} orders The order to sort by for each property.
448
433
  * @returns {number} Returns the sort order indicator for `object`.
449
434
  */
450
- function compareMultipleAscending(object, other) {
435
+ function compareMultiple(object, other, orders) {
451
436
  var index = -1,
452
437
  objCriteria = object.criteria,
453
438
  othCriteria = other.criteria,
454
- length = objCriteria.length;
439
+ length = objCriteria.length,
440
+ ordersLength = orders.length;
455
441
 
456
442
  while (++index < length) {
457
443
  var result = baseCompareAscending(objCriteria[index], othCriteria[index]);
458
444
  if (result) {
459
- return result;
445
+ if (index >= ordersLength) {
446
+ return result;
447
+ } else {
448
+ return orders[index] ? result : result * -1;
449
+ }
460
450
  }
461
451
  }
462
452
  // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
@@ -509,13 +499,13 @@
509
499
  *
510
500
  * @private
511
501
  * @param {Array} array The array to search.
512
- * @param {number} [fromIndex] The index to search from.
502
+ * @param {number} fromIndex The index to search from.
513
503
  * @param {boolean} [fromRight] Specify iterating from right to left.
514
504
  * @returns {number} Returns the index of the matched `NaN`, else `-1`.
515
505
  */
516
506
  function indexOfNaN(array, fromIndex, fromRight) {
517
507
  var length = array.length,
518
- index = fromRight ? (fromIndex || length) : ((fromIndex || 0) - 1);
508
+ index = fromIndex + (fromRight ? 0 : -1);
519
509
 
520
510
  while ((fromRight ? index-- : ++index < length)) {
521
511
  var other = array[index];
@@ -886,26 +876,26 @@
886
876
  * `mixin`, `negate`, `noop`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
887
877
  * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
888
878
  * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`,
889
- * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `splice`, `spread`,
890
- * `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`, `throttle`,
891
- * `thru`, `times`, `toArray`, `toPlainObject`, `transform`, `union`, `uniq`,
892
- * `unshift`, `unzip`, `values`, `valuesIn`, `where`, `without`, `wrap`, `xor`,
893
- * `zip`, and `zipObject`
879
+ * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`,
880
+ * `spread`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`,
881
+ * `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, `transform`,
882
+ * `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`, `where`,
883
+ * `without`, `wrap`, `xor`, `zip`, and `zipObject`
894
884
  *
895
885
  * The wrapper methods that are **not** chainable by default are:
896
- * `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,
886
+ * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,
897
887
  * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,
898
888
  * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`,
899
- * `identity`, `includes`, `indexOf`, `isArguments`, `isArray`, `isBoolean`,
900
- * `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`, `isFinite`,
901
- * `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,
889
+ * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`,
890
+ * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`,
891
+ * `isFinite`,`isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,
902
892
  * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`,
903
893
  * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`,
904
894
  * `noConflict`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`,
905
895
  * `random`, `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`,
906
896
  * `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`,
907
- * `startCase`, `startsWith`, `template`, `trim`, `trimLeft`, `trimRight`,
908
- * `trunc`, `unescape`, `uniqueId`, `value`, and `words`
897
+ * `startCase`, `startsWith`, `sum`, `template`, `trim`, `trimLeft`,
898
+ * `trimRight`, `trunc`, `unescape`, `uniqueId`, `value`, and `words`
909
899
  *
910
900
  * The wrapper method `sample` will return a wrapped value when `n` is provided,
911
901
  * otherwise an unwrapped value is returned.
@@ -1293,16 +1283,22 @@
1293
1283
  while (++iterIndex < iterLength) {
1294
1284
  var data = iteratees[iterIndex],
1295
1285
  iteratee = data.iteratee,
1296
- computed = iteratee(value, index, array),
1297
1286
  type = data.type;
1298
1287
 
1288
+ if (type != LAZY_DROP_WHILE_FLAG) {
1289
+ var computed = iteratee(value);
1290
+ } else {
1291
+ data.done = data.done && (isRight ? index < data.index : index > data.index);
1292
+ data.index = index;
1293
+ computed = data.done || (data.done = !iteratee(value));
1294
+ }
1299
1295
  if (type == LAZY_MAP_FLAG) {
1300
1296
  value = computed;
1301
1297
  } else if (!computed) {
1302
- if (type == LAZY_FILTER_FLAG) {
1303
- continue outer;
1304
- } else {
1298
+ if (type == LAZY_TAKE_WHILE_FLAG) {
1305
1299
  break outer;
1300
+ } else {
1301
+ continue outer;
1306
1302
  }
1307
1303
  }
1308
1304
  }
@@ -1985,7 +1981,7 @@
1985
1981
  }
1986
1982
  result.push(value);
1987
1983
  }
1988
- else if (indexOf(values, value) < 0) {
1984
+ else if (indexOf(values, value, 0) < 0) {
1989
1985
  result.push(value);
1990
1986
  }
1991
1987
  }
@@ -2138,13 +2134,13 @@
2138
2134
  *
2139
2135
  * @private
2140
2136
  * @param {Array} array The array to flatten.
2141
- * @param {boolean} [isDeep] Specify a deep flatten.
2142
- * @param {boolean} [isStrict] Restrict flattening to arrays and `arguments` objects.
2143
- * @param {number} [fromIndex=0] The index to start from.
2137
+ * @param {boolean} isDeep Specify a deep flatten.
2138
+ * @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects.
2139
+ * @param {number} fromIndex The index to start from.
2144
2140
  * @returns {Array} Returns the new flattened array.
2145
2141
  */
2146
2142
  function baseFlatten(array, isDeep, isStrict, fromIndex) {
2147
- var index = (fromIndex || 0) - 1,
2143
+ var index = fromIndex - 1,
2148
2144
  length = array.length,
2149
2145
  resIndex = -1,
2150
2146
  result = [];
@@ -2155,7 +2151,7 @@
2155
2151
  if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {
2156
2152
  if (isDeep) {
2157
2153
  // Recursively flatten arrays (susceptible to call stack limits).
2158
- value = baseFlatten(value, isDeep, isStrict);
2154
+ value = baseFlatten(value, isDeep, isStrict, 0);
2159
2155
  }
2160
2156
  var valIndex = -1,
2161
2157
  valLength = value.length;
@@ -2769,6 +2765,55 @@
2769
2765
  return !!result;
2770
2766
  }
2771
2767
 
2768
+ /**
2769
+ * The base implementation of `_.sortBy` which uses `comparer` to define
2770
+ * the sort order of `array` and replaces criteria objects with their
2771
+ * corresponding values.
2772
+ *
2773
+ * @private
2774
+ * @param {Array} array The array to sort.
2775
+ * @param {Function} comparer The function to define sort order.
2776
+ * @returns {Array} Returns `array`.
2777
+ */
2778
+ function baseSortBy(array, comparer) {
2779
+ var length = array.length;
2780
+
2781
+ array.sort(comparer);
2782
+ while (length--) {
2783
+ array[length] = array[length].value;
2784
+ }
2785
+ return array;
2786
+ }
2787
+
2788
+ /**
2789
+ * The base implementation of `_.sortByOrder` without param guards.
2790
+ *
2791
+ * @private
2792
+ * @param {Array|Object|string} collection The collection to iterate over.
2793
+ * @param {string[]} props The property names to sort by.
2794
+ * @param {boolean[]} orders The sort orders of `props`.
2795
+ * @returns {Array} Returns the new sorted array.
2796
+ */
2797
+ function baseSortByOrder(collection, props, orders) {
2798
+ var index = -1,
2799
+ length = collection.length,
2800
+ result = isLength(length) ? Array(length) : [];
2801
+
2802
+ baseEach(collection, function(value) {
2803
+ var length = props.length,
2804
+ criteria = Array(length);
2805
+
2806
+ while (length--) {
2807
+ criteria[length] = value == null ? undefined : value[props[length]];
2808
+ }
2809
+ result[++index] = { 'criteria': criteria, 'index': index, 'value': value };
2810
+ });
2811
+
2812
+ return baseSortBy(result, function(object, other) {
2813
+ return compareMultiple(object, other, orders);
2814
+ });
2815
+ }
2816
+
2772
2817
  /**
2773
2818
  * The base implementation of `_.uniq` without support for callback shorthands
2774
2819
  * and `this` binding.
@@ -2811,7 +2856,7 @@
2811
2856
  }
2812
2857
  result.push(value);
2813
2858
  }
2814
- else if (indexOf(seen, computed) < 0) {
2859
+ else if (indexOf(seen, computed, 0) < 0) {
2815
2860
  if (iteratee || isLarge) {
2816
2861
  seen.push(computed);
2817
2862
  }
@@ -3115,24 +3160,31 @@
3115
3160
  */
3116
3161
  function createAssigner(assigner) {
3117
3162
  return function() {
3118
- var length = arguments.length,
3119
- object = arguments[0];
3163
+ var args = arguments,
3164
+ length = args.length,
3165
+ object = args[0];
3120
3166
 
3121
3167
  if (length < 2 || object == null) {
3122
3168
  return object;
3123
3169
  }
3124
- if (length > 3 && isIterateeCall(arguments[1], arguments[2], arguments[3])) {
3125
- length = 2;
3170
+ var customizer = args[length - 2],
3171
+ thisArg = args[length - 1],
3172
+ guard = args[3];
3173
+
3174
+ if (length > 3 && typeof customizer == 'function') {
3175
+ customizer = bindCallback(customizer, thisArg, 5);
3176
+ length -= 2;
3177
+ } else {
3178
+ customizer = (length > 2 && typeof thisArg == 'function') ? thisArg : null;
3179
+ length -= (customizer ? 1 : 0);
3126
3180
  }
3127
- // Juggle arguments.
3128
- if (length > 3 && typeof arguments[length - 2] == 'function') {
3129
- var customizer = bindCallback(arguments[--length - 1], arguments[length--], 5);
3130
- } else if (length > 2 && typeof arguments[length - 1] == 'function') {
3131
- customizer = arguments[--length];
3181
+ if (guard && isIterateeCall(args[1], args[2], guard)) {
3182
+ customizer = length == 3 ? null : customizer;
3183
+ length = 2;
3132
3184
  }
3133
3185
  var index = 0;
3134
3186
  while (++index < length) {
3135
- var source = arguments[index];
3187
+ var source = args[index];
3136
3188
  if (source) {
3137
3189
  assigner(object, source, customizer);
3138
3190
  }
@@ -3170,6 +3222,41 @@
3170
3222
  return new SetCache(values);
3171
3223
  };
3172
3224
 
3225
+ /**
3226
+ * Creates a function to compose other functions into a single function.
3227
+ *
3228
+ * @private
3229
+ * @param {boolean} [fromRight] Specify iterating from right to left.
3230
+ * @returns {Function} Returns the new composer function.
3231
+ */
3232
+ function createComposer(fromRight) {
3233
+ return function() {
3234
+ var length = arguments.length,
3235
+ index = length,
3236
+ fromIndex = fromRight ? length - 1 : 0;
3237
+
3238
+ if (!length) {
3239
+ return function() { return arguments[0]; };
3240
+ }
3241
+ var funcs = Array(length);
3242
+ while (index--) {
3243
+ funcs[index] = arguments[index];
3244
+ if (typeof funcs[index] != 'function') {
3245
+ throw new TypeError(FUNC_ERROR_TEXT);
3246
+ }
3247
+ }
3248
+ return function() {
3249
+ var index = fromIndex,
3250
+ result = funcs[index].apply(this, arguments);
3251
+
3252
+ while ((fromRight ? index-- : ++index < length)) {
3253
+ result = funcs[index].call(this, result);
3254
+ }
3255
+ return result;
3256
+ };
3257
+ };
3258
+ }
3259
+
3173
3260
  /**
3174
3261
  * Creates a function that produces compound words out of the words in a
3175
3262
  * given string.
@@ -4265,16 +4352,17 @@
4265
4352
  * // => [1, 3]
4266
4353
  */
4267
4354
  function difference() {
4268
- var index = -1,
4269
- length = arguments.length;
4355
+ var args = arguments,
4356
+ index = -1,
4357
+ length = args.length;
4270
4358
 
4271
4359
  while (++index < length) {
4272
- var value = arguments[index];
4360
+ var value = args[index];
4273
4361
  if (isArray(value) || isArguments(value)) {
4274
4362
  break;
4275
4363
  }
4276
4364
  }
4277
- return baseDifference(value, baseFlatten(arguments, false, true, ++index));
4365
+ return baseDifference(value, baseFlatten(args, false, true, ++index));
4278
4366
  }
4279
4367
 
4280
4368
  /**
@@ -4386,7 +4474,7 @@
4386
4474
  * ];
4387
4475
  *
4388
4476
  * // using the `_.matches` callback shorthand
4389
- * _.pluck(_.dropRightWhile(users, { 'user': pebbles, 'active': false }), 'user');
4477
+ * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
4390
4478
  * // => ['barney', 'fred']
4391
4479
  *
4392
4480
  * // using the `_.matchesProperty` callback shorthand
@@ -4597,7 +4685,7 @@
4597
4685
  *
4598
4686
  * // using the `_.matchesProperty` callback shorthand
4599
4687
  * _.findLastIndex(users, 'active', false);
4600
- * // => 1
4688
+ * // => 2
4601
4689
  *
4602
4690
  * // using the `_.property` callback shorthand
4603
4691
  * _.findLastIndex(users, 'active');
@@ -4660,7 +4748,7 @@
4660
4748
  if (guard && isIterateeCall(array, isDeep, guard)) {
4661
4749
  isDeep = false;
4662
4750
  }
4663
- return length ? baseFlatten(array, isDeep) : [];
4751
+ return length ? baseFlatten(array, isDeep, false, 0) : [];
4664
4752
  }
4665
4753
 
4666
4754
  /**
@@ -4678,7 +4766,7 @@
4678
4766
  */
4679
4767
  function flattenDeep(array) {
4680
4768
  var length = array ? array.length : 0;
4681
- return length ? baseFlatten(array, true) : [];
4769
+ return length ? baseFlatten(array, true, false, 0) : [];
4682
4770
  }
4683
4771
 
4684
4772
  /**
@@ -4719,14 +4807,14 @@
4719
4807
  return -1;
4720
4808
  }
4721
4809
  if (typeof fromIndex == 'number') {
4722
- fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
4810
+ fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
4723
4811
  } else if (fromIndex) {
4724
4812
  var index = binaryIndex(array, value),
4725
4813
  other = array[index];
4726
4814
 
4727
4815
  return (value === value ? value === other : other !== other) ? index : -1;
4728
4816
  }
4729
- return baseIndexOf(array, value, fromIndex);
4817
+ return baseIndexOf(array, value, fromIndex || 0);
4730
4818
  }
4731
4819
 
4732
4820
  /**
@@ -4789,11 +4877,11 @@
4789
4877
  outer:
4790
4878
  while (++index < length) {
4791
4879
  value = array[index];
4792
- if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value)) < 0) {
4880
+ if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
4793
4881
  argsIndex = argsLength;
4794
4882
  while (--argsIndex) {
4795
4883
  var cache = caches[argsIndex];
4796
- if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {
4884
+ if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value, 0)) < 0) {
4797
4885
  continue outer;
4798
4886
  }
4799
4887
  }
@@ -4898,17 +4986,19 @@
4898
4986
  * // => [1, 1]
4899
4987
  */
4900
4988
  function pull() {
4901
- var array = arguments[0];
4989
+ var args = arguments,
4990
+ array = args[0];
4991
+
4902
4992
  if (!(array && array.length)) {
4903
4993
  return array;
4904
4994
  }
4905
4995
  var index = 0,
4906
4996
  indexOf = getIndexOf(),
4907
- length = arguments.length;
4997
+ length = args.length;
4908
4998
 
4909
4999
  while (++index < length) {
4910
5000
  var fromIndex = 0,
4911
- value = arguments[index];
5001
+ value = args[index];
4912
5002
 
4913
5003
  while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {
4914
5004
  splice.call(array, fromIndex, 1);
@@ -5338,7 +5428,7 @@
5338
5428
  * // => [1, 2, 4]
5339
5429
  */
5340
5430
  function union() {
5341
- return baseUniq(baseFlatten(arguments, false, true));
5431
+ return baseUniq(baseFlatten(arguments, false, true, 0));
5342
5432
  }
5343
5433
 
5344
5434
  /**
@@ -6409,104 +6499,6 @@
6409
6499
  return func(collection, iteratee);
6410
6500
  }
6411
6501
 
6412
- /**
6413
- * Gets the maximum value of `collection`. If `collection` is empty or falsey
6414
- * `-Infinity` is returned. If an iteratee function is provided it is invoked
6415
- * for each value in `collection` to generate the criterion by which the value
6416
- * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
6417
- * arguments; (value, index, collection).
6418
- *
6419
- * If a property name is provided for `predicate` the created `_.property`
6420
- * style callback returns the property value of the given element.
6421
- *
6422
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
6423
- * style callback returns `true` for elements that have a matching property
6424
- * value, else `false`.
6425
- *
6426
- * If an object is provided for `predicate` the created `_.matches` style
6427
- * callback returns `true` for elements that have the properties of the given
6428
- * object, else `false`.
6429
- *
6430
- * @static
6431
- * @memberOf _
6432
- * @category Collection
6433
- * @param {Array|Object|string} collection The collection to iterate over.
6434
- * @param {Function|Object|string} [iteratee] The function invoked per iteration.
6435
- * @param {*} [thisArg] The `this` binding of `iteratee`.
6436
- * @returns {*} Returns the maximum value.
6437
- * @example
6438
- *
6439
- * _.max([4, 2, 8, 6]);
6440
- * // => 8
6441
- *
6442
- * _.max([]);
6443
- * // => -Infinity
6444
- *
6445
- * var users = [
6446
- * { 'user': 'barney', 'age': 36 },
6447
- * { 'user': 'fred', 'age': 40 }
6448
- * ];
6449
- *
6450
- * _.max(users, function(chr) {
6451
- * return chr.age;
6452
- * });
6453
- * // => { 'user': 'fred', 'age': 40 };
6454
- *
6455
- * // using the `_.property` callback shorthand
6456
- * _.max(users, 'age');
6457
- * // => { 'user': 'fred', 'age': 40 };
6458
- */
6459
- var max = createExtremum(arrayMax);
6460
-
6461
- /**
6462
- * Gets the minimum value of `collection`. If `collection` is empty or falsey
6463
- * `Infinity` is returned. If an iteratee function is provided it is invoked
6464
- * for each value in `collection` to generate the criterion by which the value
6465
- * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
6466
- * arguments; (value, index, collection).
6467
- *
6468
- * If a property name is provided for `predicate` the created `_.property`
6469
- * style callback returns the property value of the given element.
6470
- *
6471
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
6472
- * style callback returns `true` for elements that have a matching property
6473
- * value, else `false`.
6474
- *
6475
- * If an object is provided for `predicate` the created `_.matches` style
6476
- * callback returns `true` for elements that have the properties of the given
6477
- * object, else `false`.
6478
- *
6479
- * @static
6480
- * @memberOf _
6481
- * @category Collection
6482
- * @param {Array|Object|string} collection The collection to iterate over.
6483
- * @param {Function|Object|string} [iteratee] The function invoked per iteration.
6484
- * @param {*} [thisArg] The `this` binding of `iteratee`.
6485
- * @returns {*} Returns the minimum value.
6486
- * @example
6487
- *
6488
- * _.min([4, 2, 8, 6]);
6489
- * // => 2
6490
- *
6491
- * _.min([]);
6492
- * // => Infinity
6493
- *
6494
- * var users = [
6495
- * { 'user': 'barney', 'age': 36 },
6496
- * { 'user': 'fred', 'age': 40 }
6497
- * ];
6498
- *
6499
- * _.min(users, function(chr) {
6500
- * return chr.age;
6501
- * });
6502
- * // => { 'user': 'barney', 'age': 36 };
6503
- *
6504
- * // using the `_.property` callback shorthand
6505
- * _.min(users, 'age');
6506
- * // => { 'user': 'barney', 'age': 36 };
6507
- */
6508
- var min = createExtremum(arrayMin, true);
6509
-
6510
6502
  /**
6511
6503
  * Creates an array of elements split into two groups, the first of which
6512
6504
  * contains elements `predicate` returns truthy for, while the second of which
@@ -6542,7 +6534,7 @@
6542
6534
  * _.partition([1.2, 2.3, 3.4], function(n) {
6543
6535
  * return this.floor(n) % 2;
6544
6536
  * }, Math);
6545
- * // => [[1, 3], [2]]
6537
+ * // => [[1.2, 3.4], [2.3]]
6546
6538
  *
6547
6539
  * var users = [
6548
6540
  * { 'user': 'barney', 'age': 36, 'active': false },
@@ -6782,8 +6774,8 @@
6782
6774
  }
6783
6775
 
6784
6776
  /**
6785
- * Gets the size of `collection` by returning `collection.length` for
6786
- * array-like values or the number of own enumerable properties for objects.
6777
+ * Gets the size of `collection` by returning its length for array-like
6778
+ * values or the number of own enumerable properties for objects.
6787
6779
  *
6788
6780
  * @static
6789
6781
  * @memberOf _
@@ -6913,8 +6905,11 @@
6913
6905
  * // => ['barney', 'fred', 'pebbles']
6914
6906
  */
6915
6907
  function sortBy(collection, iteratee, thisArg) {
6908
+ if (collection == null) {
6909
+ return [];
6910
+ }
6916
6911
  var index = -1,
6917
- length = collection ? collection.length : 0,
6912
+ length = collection.length,
6918
6913
  result = isLength(length) ? Array(length) : [];
6919
6914
 
6920
6915
  if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
@@ -6951,25 +6946,58 @@
6951
6946
  * // => [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
6952
6947
  */
6953
6948
  function sortByAll(collection) {
6954
- var args = arguments;
6955
- if (args.length > 3 && isIterateeCall(args[1], args[2], args[3])) {
6956
- args = [collection, args[1]];
6949
+ if (collection == null) {
6950
+ return [];
6957
6951
  }
6958
- var index = -1,
6959
- length = collection ? collection.length : 0,
6960
- props = baseFlatten(args, false, false, 1),
6961
- result = isLength(length) ? Array(length) : [];
6952
+ var args = arguments,
6953
+ guard = args[3];
6962
6954
 
6963
- baseEach(collection, function(value) {
6964
- var length = props.length,
6965
- criteria = Array(length);
6955
+ if (guard && isIterateeCall(args[1], args[2], guard)) {
6956
+ args = [collection, args[1]];
6957
+ }
6958
+ return baseSortByOrder(collection, baseFlatten(args, false, false, 1), []);
6959
+ }
6966
6960
 
6967
- while (length--) {
6968
- criteria[length] = value == null ? undefined : value[props[length]];
6969
- }
6970
- result[++index] = { 'criteria': criteria, 'index': index, 'value': value };
6971
- });
6972
- return baseSortBy(result, compareMultipleAscending);
6961
+ /**
6962
+ * This method is like `_.sortByAll` except that it allows specifying the
6963
+ * sort orders of the property names to sort by. A truthy value in `orders`
6964
+ * will sort the corresponding property name in ascending order while a
6965
+ * falsey value will sort it in descending order.
6966
+ *
6967
+ * @static
6968
+ * @memberOf _
6969
+ * @category Collection
6970
+ * @param {Array|Object|string} collection The collection to iterate over.
6971
+ * @param {string[]} props The property names to sort by.
6972
+ * @param {boolean[]} orders The sort orders of `props`.
6973
+ * @returns {Array} Returns the new sorted array.
6974
+ * @example
6975
+ *
6976
+ * var users = [
6977
+ * { 'user': 'barney', 'age': 36 },
6978
+ * { 'user': 'fred', 'age': 40 },
6979
+ * { 'user': 'barney', 'age': 26 },
6980
+ * { 'user': 'fred', 'age': 30 }
6981
+ * ];
6982
+ *
6983
+ * // sort by `user` in ascending order and by `age` in descending order
6984
+ * _.map(_.sortByOrder(users, ['user', 'age'], [true, false]), _.values);
6985
+ * // => [['barney', 36], ['barney', 26], ['fred', 40], ['fred', 30]]
6986
+ */
6987
+ function sortByOrder(collection, props, orders, guard) {
6988
+ if (collection == null) {
6989
+ return [];
6990
+ }
6991
+ if (guard && isIterateeCall(props, orders, guard)) {
6992
+ orders = null;
6993
+ }
6994
+ if (!isArray(props)) {
6995
+ props = props == null ? [] : [props];
6996
+ }
6997
+ if (!isArray(orders)) {
6998
+ orders = orders == null ? [] : [orders];
6999
+ }
7000
+ return baseSortByOrder(collection, props, orders);
6973
7001
  }
6974
7002
 
6975
7003
  /**
@@ -7592,38 +7620,15 @@
7592
7620
  * @returns {Function} Returns the new function.
7593
7621
  * @example
7594
7622
  *
7595
- * function add(x, y) {
7596
- * return x + y;
7597
- * }
7598
- *
7599
7623
  * function square(n) {
7600
7624
  * return n * n;
7601
7625
  * }
7602
7626
  *
7603
- * var addSquare = _.flow(add, square);
7627
+ * var addSquare = _.flow(_.add, square);
7604
7628
  * addSquare(1, 2);
7605
7629
  * // => 9
7606
7630
  */
7607
- function flow() {
7608
- var funcs = arguments,
7609
- length = funcs.length;
7610
-
7611
- if (!length) {
7612
- return function() { return arguments[0]; };
7613
- }
7614
- if (!arrayEvery(funcs, baseIsFunction)) {
7615
- throw new TypeError(FUNC_ERROR_TEXT);
7616
- }
7617
- return function() {
7618
- var index = 0,
7619
- result = funcs[index].apply(this, arguments);
7620
-
7621
- while (++index < length) {
7622
- result = funcs[index].call(this, result);
7623
- }
7624
- return result;
7625
- };
7626
- }
7631
+ var flow = createComposer();
7627
7632
 
7628
7633
  /**
7629
7634
  * This method is like `_.flow` except that it creates a function that
@@ -7637,38 +7642,15 @@
7637
7642
  * @returns {Function} Returns the new function.
7638
7643
  * @example
7639
7644
  *
7640
- * function add(x, y) {
7641
- * return x + y;
7642
- * }
7643
- *
7644
7645
  * function square(n) {
7645
7646
  * return n * n;
7646
7647
  * }
7647
7648
  *
7648
- * var addSquare = _.flowRight(square, add);
7649
+ * var addSquare = _.flowRight(square, _.add);
7649
7650
  * addSquare(1, 2);
7650
7651
  * // => 9
7651
7652
  */
7652
- function flowRight() {
7653
- var funcs = arguments,
7654
- fromIndex = funcs.length - 1;
7655
-
7656
- if (fromIndex < 0) {
7657
- return function() { return arguments[0]; };
7658
- }
7659
- if (!arrayEvery(funcs, baseIsFunction)) {
7660
- throw new TypeError(FUNC_ERROR_TEXT);
7661
- }
7662
- return function() {
7663
- var index = fromIndex,
7664
- result = funcs[index].apply(this, arguments);
7665
-
7666
- while (index--) {
7667
- result = funcs[index].call(this, result);
7668
- }
7669
- return result;
7670
- };
7671
- }
7653
+ var flowRight = createComposer(true);
7672
7654
 
7673
7655
  /**
7674
7656
  * Creates a function that memoizes the result of `func`. If `resolver` is
@@ -7728,13 +7710,14 @@
7728
7710
  throw new TypeError(FUNC_ERROR_TEXT);
7729
7711
  }
7730
7712
  var memoized = function() {
7731
- var cache = memoized.cache,
7732
- key = resolver ? resolver.apply(this, arguments) : arguments[0];
7713
+ var args = arguments,
7714
+ cache = memoized.cache,
7715
+ key = resolver ? resolver.apply(this, args) : args[0];
7733
7716
 
7734
7717
  if (cache.has(key)) {
7735
7718
  return cache.get(key);
7736
7719
  }
7737
- var result = func.apply(this, arguments);
7720
+ var result = func.apply(this, args);
7738
7721
  cache.set(key, result);
7739
7722
  return result;
7740
7723
  };
@@ -8257,7 +8240,7 @@
8257
8240
  }
8258
8241
 
8259
8242
  /**
8260
- * Checks if a value is empty. A value is considered empty unless it is an
8243
+ * Checks if `value` is empty. A value is considered empty unless it is an
8261
8244
  * `arguments` object, array, string, or jQuery-like collection with a length
8262
8245
  * greater than `0` or an object with own enumerable properties.
8263
8246
  *
@@ -8875,7 +8858,7 @@
8875
8858
  /**
8876
8859
  * Assigns own enumerable properties of source object(s) to the destination
8877
8860
  * object for all destination properties that resolve to `undefined`. Once a
8878
- * property is set, additional defaults of the same property are ignored.
8861
+ * property is set, additional values of the same property are ignored.
8879
8862
  *
8880
8863
  * @static
8881
8864
  * @memberOf _
@@ -9694,7 +9677,7 @@
9694
9677
 
9695
9678
  /**
9696
9679
  * Checks if `n` is between `start` and up to but not including, `end`. If
9697
- * `end` is not specified it defaults to `start` with `start` becoming `0`.
9680
+ * `end` is not specified it is set to `start` with `start` then set to `0`.
9698
9681
  *
9699
9682
  * @static
9700
9683
  * @memberOf _
@@ -9892,7 +9875,7 @@
9892
9875
  }
9893
9876
 
9894
9877
  /**
9895
- * Converts the characters "&", "<", ">", '"', "'", and '`', in `string` to
9878
+ * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to
9896
9879
  * their corresponding HTML entities.
9897
9880
  *
9898
9881
  * **Note:** No other characters are escaped. To escape additional characters
@@ -10695,14 +10678,14 @@
10695
10678
  * }
10696
10679
  */
10697
10680
  function attempt() {
10698
- var length = arguments.length,
10699
- func = arguments[0];
10681
+ var func = arguments[0],
10682
+ length = arguments.length,
10683
+ args = Array(length ? length - 1 : 0);
10700
10684
 
10685
+ while (--length > 0) {
10686
+ args[length - 1] = arguments[length];
10687
+ }
10701
10688
  try {
10702
- var args = Array(length ? length - 1 : 0);
10703
- while (--length > 0) {
10704
- args[length - 1] = arguments[length];
10705
- }
10706
10689
  return func.apply(undefined, args);
10707
10690
  } catch(e) {
10708
10691
  return isError(e) ? e : new Error(e);
@@ -11031,9 +11014,9 @@
11031
11014
 
11032
11015
  /**
11033
11016
  * Creates an array of numbers (positive and/or negative) progressing from
11034
- * `start` up to, but not including, `end`. If `end` is not specified it
11035
- * defaults to `start` with `start` becoming `0`. If `start` is less than
11036
- * `end` a zero-length range is created unless a negative `step` is specified.
11017
+ * `start` up to, but not including, `end`. If `end` is not specified it is
11018
+ * set to `start` with `start` then set to `0`. If `start` is less than `end`
11019
+ * a zero-length range is created unless a negative `step` is specified.
11037
11020
  *
11038
11021
  * @static
11039
11022
  * @memberOf _
@@ -11160,6 +11143,153 @@
11160
11143
 
11161
11144
  /*------------------------------------------------------------------------*/
11162
11145
 
11146
+ /**
11147
+ * Adds two numbers.
11148
+ *
11149
+ * @static
11150
+ * @memberOf _
11151
+ * @category Math
11152
+ * @param {number} augend The first number to add.
11153
+ * @param {number} addend The second number to add.
11154
+ * @returns {number} Returns the sum.
11155
+ * @example
11156
+ *
11157
+ * _.add(6, 4);
11158
+ * // => 10
11159
+ */
11160
+ function add(augend, addend) {
11161
+ return augend + addend;
11162
+ }
11163
+
11164
+ /**
11165
+ * Gets the maximum value of `collection`. If `collection` is empty or falsey
11166
+ * `-Infinity` is returned. If an iteratee function is provided it is invoked
11167
+ * for each value in `collection` to generate the criterion by which the value
11168
+ * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
11169
+ * arguments; (value, index, collection).
11170
+ *
11171
+ * If a property name is provided for `predicate` the created `_.property`
11172
+ * style callback returns the property value of the given element.
11173
+ *
11174
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
11175
+ * style callback returns `true` for elements that have a matching property
11176
+ * value, else `false`.
11177
+ *
11178
+ * If an object is provided for `predicate` the created `_.matches` style
11179
+ * callback returns `true` for elements that have the properties of the given
11180
+ * object, else `false`.
11181
+ *
11182
+ * @static
11183
+ * @memberOf _
11184
+ * @category Math
11185
+ * @param {Array|Object|string} collection The collection to iterate over.
11186
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
11187
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
11188
+ * @returns {*} Returns the maximum value.
11189
+ * @example
11190
+ *
11191
+ * _.max([4, 2, 8, 6]);
11192
+ * // => 8
11193
+ *
11194
+ * _.max([]);
11195
+ * // => -Infinity
11196
+ *
11197
+ * var users = [
11198
+ * { 'user': 'barney', 'age': 36 },
11199
+ * { 'user': 'fred', 'age': 40 }
11200
+ * ];
11201
+ *
11202
+ * _.max(users, function(chr) {
11203
+ * return chr.age;
11204
+ * });
11205
+ * // => { 'user': 'fred', 'age': 40 };
11206
+ *
11207
+ * // using the `_.property` callback shorthand
11208
+ * _.max(users, 'age');
11209
+ * // => { 'user': 'fred', 'age': 40 };
11210
+ */
11211
+ var max = createExtremum(arrayMax);
11212
+
11213
+ /**
11214
+ * Gets the minimum value of `collection`. If `collection` is empty or falsey
11215
+ * `Infinity` is returned. If an iteratee function is provided it is invoked
11216
+ * for each value in `collection` to generate the criterion by which the value
11217
+ * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
11218
+ * arguments; (value, index, collection).
11219
+ *
11220
+ * If a property name is provided for `predicate` the created `_.property`
11221
+ * style callback returns the property value of the given element.
11222
+ *
11223
+ * If a value is also provided for `thisArg` the created `_.matchesProperty`
11224
+ * style callback returns `true` for elements that have a matching property
11225
+ * value, else `false`.
11226
+ *
11227
+ * If an object is provided for `predicate` the created `_.matches` style
11228
+ * callback returns `true` for elements that have the properties of the given
11229
+ * object, else `false`.
11230
+ *
11231
+ * @static
11232
+ * @memberOf _
11233
+ * @category Math
11234
+ * @param {Array|Object|string} collection The collection to iterate over.
11235
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
11236
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
11237
+ * @returns {*} Returns the minimum value.
11238
+ * @example
11239
+ *
11240
+ * _.min([4, 2, 8, 6]);
11241
+ * // => 2
11242
+ *
11243
+ * _.min([]);
11244
+ * // => Infinity
11245
+ *
11246
+ * var users = [
11247
+ * { 'user': 'barney', 'age': 36 },
11248
+ * { 'user': 'fred', 'age': 40 }
11249
+ * ];
11250
+ *
11251
+ * _.min(users, function(chr) {
11252
+ * return chr.age;
11253
+ * });
11254
+ * // => { 'user': 'barney', 'age': 36 };
11255
+ *
11256
+ * // using the `_.property` callback shorthand
11257
+ * _.min(users, 'age');
11258
+ * // => { 'user': 'barney', 'age': 36 };
11259
+ */
11260
+ var min = createExtremum(arrayMin, true);
11261
+
11262
+ /**
11263
+ * Gets the sum of the values in `collection`.
11264
+ *
11265
+ * @static
11266
+ * @memberOf _
11267
+ * @category Math
11268
+ * @param {Array|Object|string} collection The collection to iterate over.
11269
+ * @returns {number} Returns the sum.
11270
+ * @example
11271
+ *
11272
+ * _.sum([4, 6, 2]);
11273
+ * // => 12
11274
+ *
11275
+ * _.sum({ 'a': 4, 'b': 6, 'c': 2 });
11276
+ * // => 12
11277
+ */
11278
+ function sum(collection) {
11279
+ if (!isArray(collection)) {
11280
+ collection = toIterable(collection);
11281
+ }
11282
+ var length = collection.length,
11283
+ result = 0;
11284
+
11285
+ while (length--) {
11286
+ result += +collection[length] || 0;
11287
+ }
11288
+ return result;
11289
+ }
11290
+
11291
+ /*------------------------------------------------------------------------*/
11292
+
11163
11293
  // Ensure wrappers are instances of `baseLodash`.
11164
11294
  lodash.prototype = baseLodash.prototype;
11165
11295
 
@@ -11258,6 +11388,7 @@
11258
11388
  lodash.slice = slice;
11259
11389
  lodash.sortBy = sortBy;
11260
11390
  lodash.sortByAll = sortByAll;
11391
+ lodash.sortByOrder = sortByOrder;
11261
11392
  lodash.spread = spread;
11262
11393
  lodash.take = take;
11263
11394
  lodash.takeRight = takeRight;
@@ -11302,6 +11433,7 @@
11302
11433
  /*------------------------------------------------------------------------*/
11303
11434
 
11304
11435
  // Add functions that return unwrapped values when chaining.
11436
+ lodash.add = add;
11305
11437
  lodash.attempt = attempt;
11306
11438
  lodash.camelCase = camelCase;
11307
11439
  lodash.capitalize = capitalize;
@@ -11371,6 +11503,7 @@
11371
11503
  lodash.sortedLastIndex = sortedLastIndex;
11372
11504
  lodash.startCase = startCase;
11373
11505
  lodash.startsWith = startsWith;
11506
+ lodash.sum = sum;
11374
11507
  lodash.template = template;
11375
11508
  lodash.trim = trim;
11376
11509
  lodash.trimLeft = trimLeft;
@@ -11432,15 +11565,17 @@
11432
11565
  });
11433
11566
 
11434
11567
  // Add `LazyWrapper` methods that accept an `iteratee` value.
11435
- arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
11436
- var isFilter = index == LAZY_FILTER_FLAG || index == LAZY_WHILE_FLAG;
11568
+ arrayEach(['dropWhile', 'filter', 'map', 'takeWhile'], function(methodName, type) {
11569
+ var isFilter = type != LAZY_MAP_FLAG,
11570
+ isDropWhile = type == LAZY_DROP_WHILE_FLAG;
11437
11571
 
11438
11572
  LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {
11439
- var result = this.clone(),
11573
+ var filtered = this.__filtered__,
11574
+ result = (filtered && isDropWhile) ? new LazyWrapper(this) : this.clone(),
11440
11575
  iteratees = result.__iteratees__ || (result.__iteratees__ = []);
11441
11576
 
11442
- result.__filtered__ = result.__filtered__ || isFilter;
11443
- iteratees.push({ 'iteratee': getCallback(iteratee, thisArg, 3), 'type': index });
11577
+ result.__filtered__ = filtered || isFilter;
11578
+ iteratees.push({ 'done': false, 'index': 0, 'iteratee': getCallback(iteratee, thisArg, 1), 'type': type });
11444
11579
  return result;
11445
11580
  };
11446
11581
  });
@@ -11505,23 +11640,10 @@
11505
11640
  return this.filter(identity);
11506
11641
  };
11507
11642
 
11508
- LazyWrapper.prototype.dropWhile = function(predicate, thisArg) {
11509
- var done,
11510
- lastIndex,
11511
- isRight = this.__dir__ < 0;
11512
-
11513
- predicate = getCallback(predicate, thisArg, 3);
11514
- return this.filter(function(value, index, array) {
11515
- done = done && (isRight ? index < lastIndex : index > lastIndex);
11516
- lastIndex = index;
11517
- return done || (done = !predicate(value, index, array));
11518
- });
11519
- };
11520
-
11521
11643
  LazyWrapper.prototype.reject = function(predicate, thisArg) {
11522
- predicate = getCallback(predicate, thisArg, 3);
11523
- return this.filter(function(value, index, array) {
11524
- return !predicate(value, index, array);
11644
+ predicate = getCallback(predicate, thisArg, 1);
11645
+ return this.filter(function(value) {
11646
+ return !predicate(value);
11525
11647
  });
11526
11648
  };
11527
11649
 
@@ -11543,16 +11665,24 @@
11543
11665
  // Add `LazyWrapper` methods to `lodash.prototype`.
11544
11666
  baseForOwn(LazyWrapper.prototype, function(func, methodName) {
11545
11667
  var lodashFunc = lodash[methodName],
11668
+ checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),
11546
11669
  retUnwrapped = /^(?:first|last)$/.test(methodName);
11547
11670
 
11548
11671
  lodash.prototype[methodName] = function() {
11549
- var value = this.__wrapped__,
11550
- args = arguments,
11672
+ var args = arguments,
11673
+ length = args.length,
11551
11674
  chainAll = this.__chain__,
11675
+ value = this.__wrapped__,
11552
11676
  isHybrid = !!this.__actions__.length,
11553
11677
  isLazy = value instanceof LazyWrapper,
11554
- onlyLazy = isLazy && !isHybrid;
11678
+ iteratee = args[0],
11679
+ useLazy = isLazy || isArray(value);
11555
11680
 
11681
+ if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
11682
+ // avoid lazy use if the iteratee has a `length` other than `1`
11683
+ isLazy = useLazy = false;
11684
+ }
11685
+ var onlyLazy = isLazy && !isHybrid;
11556
11686
  if (retUnwrapped && !chainAll) {
11557
11687
  return onlyLazy
11558
11688
  ? func.call(value)
@@ -11563,7 +11693,7 @@
11563
11693
  push.apply(otherArgs, args);
11564
11694
  return lodashFunc.apply(lodash, otherArgs);
11565
11695
  };
11566
- if (isLazy || isArray(value)) {
11696
+ if (useLazy) {
11567
11697
  var wrapper = onlyLazy ? value : new LazyWrapper(this),
11568
11698
  result = func.apply(wrapper, args);
11569
11699