underscore-source 1.1.2 → 1.1.3

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.
@@ -1,5 +1,5 @@
1
1
  module Underscore
2
2
  module Source
3
- VERSION = "1.1.2"
3
+ VERSION = "1.1.3"
4
4
  end
5
5
  end
@@ -1,3 +1,4 @@
1
+ // Underscore.js 1.1.3
1
2
  // (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
2
3
  // Underscore is freely distributable under the MIT license.
3
4
  // Portions of Underscore are inspired or borrowed from Prototype,
@@ -16,18 +17,17 @@
16
17
  // Save the previous value of the `_` variable.
17
18
  var previousUnderscore = root._;
18
19
 
19
- // Establish the object that gets thrown to break out of a loop iteration.
20
- var breaker = typeof StopIteration !== 'undefined' ? StopIteration : '__break__';
20
+ // Establish the object that gets returned to break out of a loop iteration.
21
+ var breaker = {};
21
22
 
22
23
  // Save bytes in the minified (but not gzipped) version:
23
24
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
24
25
 
25
26
  // Create quick reference variables for speed access to core prototypes.
26
- var slice = ArrayProto.slice,
27
- unshift = ArrayProto.unshift,
28
- toString = ObjProto.toString,
29
- hasOwnProperty = ObjProto.hasOwnProperty,
30
- propertyIsEnumerable = ObjProto.propertyIsEnumerable;
27
+ var slice = ArrayProto.slice,
28
+ unshift = ArrayProto.unshift,
29
+ toString = ObjProto.toString,
30
+ hasOwnProperty = ObjProto.hasOwnProperty;
31
31
 
32
32
  // All **ECMAScript 5** native function implementations that we hope to use
33
33
  // are declared here.
@@ -47,14 +47,18 @@
47
47
  // Create a safe reference to the Underscore object for use below.
48
48
  var _ = function(obj) { return new wrapper(obj); };
49
49
 
50
- // Export the Underscore object for **CommonJS**.
51
- if (typeof exports !== 'undefined') exports._ = _;
52
-
53
- // Export Underscore to the global scope.
54
- root._ = _;
50
+ // Export the Underscore object for **CommonJS**, with backwards-compatibility
51
+ // for the old `require()` API. If we're not in CommonJS, add `_` to the
52
+ // global object.
53
+ if (typeof module !== 'undefined' && module.exports) {
54
+ module.exports = _;
55
+ _._ = _;
56
+ } else {
57
+ root._ = _;
58
+ }
55
59
 
56
60
  // Current version.
57
- _.VERSION = '1.1.2';
61
+ _.VERSION = '1.1.3';
58
62
 
59
63
  // Collection Functions
60
64
  // --------------------
@@ -63,20 +67,20 @@
63
67
  // Handles objects implementing `forEach`, arrays, and raw objects.
64
68
  // Delegates to **ECMAScript 5**'s native `forEach` if available.
65
69
  var each = _.each = _.forEach = function(obj, iterator, context) {
66
- try {
67
- if (nativeForEach && obj.forEach === nativeForEach) {
68
- obj.forEach(iterator, context);
69
- } else if (_.isNumber(obj.length)) {
70
- for (var i = 0, l = obj.length; i < l; i++) iterator.call(context, obj[i], i, obj);
71
- } else {
72
- for (var key in obj) {
73
- if (hasOwnProperty.call(obj, key)) iterator.call(context, obj[key], key, obj);
70
+ var value;
71
+ if (nativeForEach && obj.forEach === nativeForEach) {
72
+ obj.forEach(iterator, context);
73
+ } else if (_.isNumber(obj.length)) {
74
+ for (var i = 0, l = obj.length; i < l; i++) {
75
+ if (iterator.call(context, obj[i], i, obj) === breaker) return;
76
+ }
77
+ } else {
78
+ for (var key in obj) {
79
+ if (hasOwnProperty.call(obj, key)) {
80
+ if (iterator.call(context, obj[key], key, obj) === breaker) return;
74
81
  }
75
82
  }
76
- } catch(e) {
77
- if (e != breaker) throw e;
78
83
  }
79
- return obj;
80
84
  };
81
85
 
82
86
  // Return the results of applying the iterator to each element.
@@ -93,12 +97,17 @@
93
97
  // **Reduce** builds up a single result from a list of values, aka `inject`,
94
98
  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
95
99
  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
100
+ var initial = memo !== void 0;
96
101
  if (nativeReduce && obj.reduce === nativeReduce) {
97
102
  if (context) iterator = _.bind(iterator, context);
98
- return obj.reduce(iterator, memo);
103
+ return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
99
104
  }
100
105
  each(obj, function(value, index, list) {
101
- memo = iterator.call(context, memo, value, index, list);
106
+ if (!initial && index === 0) {
107
+ memo = value;
108
+ } else {
109
+ memo = iterator.call(context, memo, value, index, list);
110
+ }
102
111
  });
103
112
  return memo;
104
113
  };
@@ -108,7 +117,7 @@
108
117
  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
109
118
  if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
110
119
  if (context) iterator = _.bind(iterator, context);
111
- return obj.reduceRight(iterator, memo);
120
+ return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
112
121
  }
113
122
  var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse();
114
123
  return _.reduce(reversed, iterator, memo, context);
@@ -117,10 +126,10 @@
117
126
  // Return the first value which passes a truth test. Aliased as `detect`.
118
127
  _.find = _.detect = function(obj, iterator, context) {
119
128
  var result;
120
- each(obj, function(value, index, list) {
129
+ any(obj, function(value, index, list) {
121
130
  if (iterator.call(context, value, index, list)) {
122
131
  result = value;
123
- _.breakLoop();
132
+ return true;
124
133
  }
125
134
  });
126
135
  return result;
@@ -155,7 +164,7 @@
155
164
  if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
156
165
  var result = true;
157
166
  each(obj, function(value, index, list) {
158
- if (!(result = result && iterator.call(context, value, index, list))) _.breakLoop();
167
+ if (!(result = result && iterator.call(context, value, index, list))) return breaker;
159
168
  });
160
169
  return result;
161
170
  };
@@ -163,12 +172,12 @@
163
172
  // Determine if at least one element in the object matches a truth test.
164
173
  // Delegates to **ECMAScript 5**'s native `some` if available.
165
174
  // Aliased as `any`.
166
- _.some = _.any = function(obj, iterator, context) {
175
+ var any = _.some = _.any = function(obj, iterator, context) {
167
176
  iterator = iterator || _.identity;
168
177
  if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
169
178
  var result = false;
170
179
  each(obj, function(value, index, list) {
171
- if (result = iterator.call(context, value, index, list)) _.breakLoop();
180
+ if (result = iterator.call(context, value, index, list)) return breaker;
172
181
  });
173
182
  return result;
174
183
  };
@@ -178,8 +187,8 @@
178
187
  _.include = _.contains = function(obj, target) {
179
188
  if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
180
189
  var found = false;
181
- each(obj, function(value) {
182
- if (found = value === target) _.breakLoop();
190
+ any(obj, function(value) {
191
+ if (found = value === target) return true;
183
192
  });
184
193
  return found;
185
194
  };
@@ -333,7 +342,7 @@
333
342
  };
334
343
 
335
344
  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
336
- // we need this function. Return the position of the first occurence of an
345
+ // we need this function. Return the position of the first occurrence of an
337
346
  // item in an array, or -1 if the item is not included in the array.
338
347
  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
339
348
  _.indexOf = function(array, item) {
@@ -414,6 +423,33 @@
414
423
  return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
415
424
  };
416
425
 
426
+ // Internal function used to implement `_.throttle` and `_.debounce`.
427
+ var limit = function(func, wait, debounce) {
428
+ var timeout;
429
+ return function() {
430
+ var context = this, args = arguments;
431
+ var throttler = function() {
432
+ timeout = null;
433
+ func.apply(context, args);
434
+ };
435
+ if (debounce) clearTimeout(timeout);
436
+ if (debounce || !timeout) timeout = setTimeout(throttler, wait);
437
+ };
438
+ };
439
+
440
+ // Returns a function, that, when invoked, will only be triggered at most once
441
+ // during a given window of time.
442
+ _.throttle = function(func, wait) {
443
+ return limit(func, wait, false);
444
+ };
445
+
446
+ // Returns a function, that, as long as it continues to be invoked, will not
447
+ // be triggered. The function will be called after it stops being called for
448
+ // N milliseconds.
449
+ _.debounce = function(func, wait) {
450
+ return limit(func, wait, true);
451
+ };
452
+
417
453
  // Returns the first function passed as an argument to the second,
418
454
  // allowing you to adjust arguments, run code before and after, and
419
455
  // conditionally execute the original function.
@@ -552,7 +588,13 @@
552
588
 
553
589
  // Is a given value a number?
554
590
  _.isNumber = function(obj) {
555
- return (obj === +obj) || (toString.call(obj) === '[object Number]');
591
+ return !!(obj === 0 || (obj && obj.toExponential && obj.toFixed));
592
+ };
593
+
594
+ // Is the given value NaN -- this one is interesting. NaN != NaN, and
595
+ // isNaN(undefined) == true, so we make sure it's a number first.
596
+ _.isNaN = function(obj) {
597
+ return toString.call(obj) === '[object Number]' && isNaN(obj);
556
598
  };
557
599
 
558
600
  // Is a given value a boolean?
@@ -570,12 +612,6 @@
570
612
  return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
571
613
  };
572
614
 
573
- // Is the given value NaN -- this one is interesting. NaN != NaN, and
574
- // isNaN(undefined) == true, so we make sure it's a number first.
575
- _.isNaN = function(obj) {
576
- return _.isNumber(obj) && isNaN(obj);
577
- };
578
-
579
615
  // Is a given value equal to null?
580
616
  _.isNull = function(obj) {
581
617
  return obj === null;
@@ -583,7 +619,7 @@
583
619
 
584
620
  // Is a given variable undefined?
585
621
  _.isUndefined = function(obj) {
586
- return typeof obj == 'undefined';
622
+ return obj === void 0;
587
623
  };
588
624
 
589
625
  // Utility Functions
@@ -606,11 +642,6 @@
606
642
  for (var i = 0; i < n; i++) iterator.call(context, i);
607
643
  };
608
644
 
609
- // Break out of the middle of an iteration.
610
- _.breakLoop = function() {
611
- throw breaker;
612
- };
613
-
614
645
  // Add your own custom functions to the Underscore object, ensuring that
615
646
  // they're correctly added to the OOP wrapper as well.
616
647
  _.mixin = function(obj) {
@@ -641,7 +672,8 @@
641
672
  var c = _.templateSettings;
642
673
  var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
643
674
  'with(obj||{}){__p.push(\'' +
644
- str.replace(/'/g, "\\'")
675
+ str.replace(/\\/g, '\\\\')
676
+ .replace(/'/g, "\\'")
645
677
  .replace(c.interpolate, function(match, code) {
646
678
  return "'," + code.replace(/\\'/g, "'") + ",'";
647
679
  })
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: underscore-source
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.1.2
5
+ version: 1.1.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel X. Moore