Update builds and docs.

Former-commit-id: e66c5377ffb5c03191673004bb82781a0562535a
This commit is contained in:
John-David Dalton
2013-07-06 20:08:41 -07:00
parent 7ce5dcdead
commit 5028b07aaa
7 changed files with 563 additions and 499 deletions

View File

@@ -24,8 +24,9 @@
/** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */
var keyPrefix = +new Date + '';
/** Used to match HTML entities */
var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;
/** Used to match HTML entities and HTML characters */
var reEscapedHtml = /&(?:amp|lt|gt|quot|#x27|#x2F);/g,
reUnescapedHtml = /[&<>"'\/]/g;
/** Used to match "interpolate" template delimiters */
var reInterpolate = /<%=([\s\S]+?)%>/g;
@@ -33,9 +34,6 @@
/** Used to ensure capturing order of template delimiters */
var reNoMatch = /($^)/;
/** Used to match HTML characters */
var reUnescapedHtml = /[&<>"']/g;
/** Used to match unescaped characters in compiled string literals */
var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g;
@@ -501,12 +499,12 @@
* // => false
*/
function isArguments(value) {
return toString.call(value) == argsClass;
return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;
}
// fallback for browsers that can't detect `arguments` objects by [[Class]]
if (!isArguments(arguments)) {
isArguments = function(value) {
return value ? hasOwnProperty.call(value, 'callee') : false;
return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;
};
}
@@ -527,7 +525,7 @@
* // => true
*/
var isArray = nativeIsArray || function(value) {
return value ? (typeof value == 'object' && toString.call(value) == arrayClass) : false;
return (value && typeof value == 'object') ? toString.call(value) == arrayClass : false;
};
/**
@@ -584,7 +582,8 @@
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;'
"'": '&#x27;',
'/': '&#x2F;'
};
/** Used to convert HTML entities to characters */
@@ -713,7 +712,7 @@
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
if (typeof object[key] == 'undefined') {
object[key] = iterable[key];
}
}
@@ -1254,7 +1253,7 @@
* // => true
*/
function isRegExp(value) {
return !!(value && objectTypes[typeof value]) && toString.call(value) == regexpClass;
return (value && objectTypes[typeof value]) ? toString.call(value) == regexpClass : false;
}
/**
@@ -2624,7 +2623,7 @@
while (++index < length) {
var value = array[index];
if (isArray(value)) {
if (value && typeof value == 'object' && (isArray(value) || isArguments(value))) {
push.apply(result, isShallow ? value : flatten(value));
} else {
result.push(value);
@@ -3097,10 +3096,10 @@
* // => [1, 2, 3, 101, 10]
*/
function union(array) {
if (!isArray(array)) {
arguments[0] = array ? nativeSlice.call(array) : arrayRef;
if (!array) {
arguments[0] = arrayRef;
}
return uniq(concat.apply(arrayRef, arguments));
return uniq(flatten(arguments, true));
}
/**
@@ -3193,8 +3192,9 @@
* _.unzip([['moe', 30, true], ['larry', 40, false]]);
* // => [['moe', 'larry'], [30, 40], [true, false]];
*/
function unzip(array) {
var index = -1,
function unzip() {
var array = arguments.length > 1 ? arguments : arguments[0],
index = -1,
length = array ? max(pluck(array, 'length')) : 0,
result = Array(length < 0 ? 0 : length);
@@ -3240,14 +3240,7 @@
* // => [['moe', 30, true], ['larry', 40, false]]
*/
function zip(array) {
var index = -1,
length = array ? max(pluck(arguments, 'length')) : 0,
result = Array(length < 0 ? 0 : length);
while (++index < length) {
result[index] = pluck(arguments, index);
}
return result;
return array ? unzip(arguments) : [];
}
/**
@@ -3287,17 +3280,14 @@
/*--------------------------------------------------------------------------*/
/**
* If `n` is greater than `0`, a function is created that is restricted to
* executing `func`, with the `this` binding and arguments of the created
* function, only after it is called `n` times. If `n` is less than `1`,
* `func` is executed immediately, without a `this` binding or additional
* arguments, and its result is returned.
* Creates a function this is restricted to executing `func`, with the `this`
* binding and arguments of the created function, only after it is called `n` times.
*
* @static
* @memberOf _
* @category Functions
* @param {Number} n The number of times the function must be called before
* it is executed.
* `func` is executed.
* @param {Function} func The function to restrict.
* @returns {Function} Returns the new restricted function.
* @example
@@ -3309,9 +3299,6 @@
* // `renderNotes` is run once, after all notes have saved
*/
function after(n, func) {
if (n < 1) {
return func();
}
return function() {
if (--n < 1) {
return func.apply(this, arguments);
@@ -3547,28 +3534,83 @@
* 'maxWait': 1000
* }, false);
*/
function debounce(func, wait, immediate) {
function debounce(func, wait, options) {
var args,
result,
thisArg,
timeoutId = null;
callCount = 0,
lastCalled = 0,
maxWait = false,
maxTimeoutId = null,
timeoutId = null,
trailing = true;
function clear() {
clearTimeout(maxTimeoutId);
clearTimeout(timeoutId);
callCount = 0;
maxTimeoutId = timeoutId = null;
}
function delayed() {
timeoutId = null;
if (!immediate) {
var isCalled = trailing && (!leading || callCount > 1);
clear();
if (isCalled) {
if (maxWait !== false) {
lastCalled = new Date;
}
result = func.apply(thisArg, args);
}
}
function maxDelayed() {
clear();
if (trailing || (maxWait !== wait)) {
lastCalled = new Date;
result = func.apply(thisArg, args);
}
}
wait = nativeMax(0, wait || 0);
if (options === true) {
var leading = true;
trailing = false;
} else if (isObject(options)) {
leading = options.leading;
maxWait = 'maxWait' in options && nativeMax(wait, options.maxWait || 0);
trailing = 'trailing' in options ? options.trailing : trailing;
}
return function() {
var isImmediate = immediate && !timeoutId;
args = arguments;
thisArg = this;
callCount++;
// avoid issues with Titanium and `undefined` timeout ids
// https://github.com/appcelerator/titanium_mobile/blob/3_1_0_GA/android/titanium/src/java/ti/modules/titanium/TitaniumModule.java#L185-L192
clearTimeout(timeoutId);
timeoutId = setTimeout(delayed, wait);
if (isImmediate) {
result = func.apply(thisArg, args);
if (maxWait === false) {
if (leading && callCount < 2) {
result = func.apply(thisArg, args);
}
} else {
var now = new Date;
if (!maxTimeoutId && !leading) {
lastCalled = now;
}
var remaining = maxWait - (now - lastCalled);
if (remaining <= 0) {
clearTimeout(maxTimeoutId);
maxTimeoutId = null;
lastCalled = now;
result = func.apply(thisArg, args);
}
else if (!maxTimeoutId) {
maxTimeoutId = setTimeout(maxDelayed, remaining);
}
}
if (wait !== maxWait) {
timeoutId = setTimeout(delayed, wait);
}
return result;
};
@@ -3733,36 +3775,22 @@
* 'trailing': false
* }));
*/
function throttle(func, wait) {
var args,
result,
thisArg,
lastCalled = 0,
timeoutId = null;
function throttle(func, wait, options) {
var leading = true,
trailing = true;
function trailingCall() {
lastCalled = new Date;
timeoutId = null;
result = func.apply(thisArg, args);
if (options === false) {
leading = false;
} else if (isObject(options)) {
leading = 'leading' in options ? options.leading : leading;
trailing = 'trailing' in options ? options.trailing : trailing;
}
return function() {
var now = new Date,
remaining = wait - (now - lastCalled);
options = {};
options.leading = leading;
options.maxWait = wait;
options.trailing = trailing;
args = arguments;
thisArg = this;
if (remaining <= 0) {
clearTimeout(timeoutId);
timeoutId = null;
lastCalled = now;
result = func.apply(thisArg, args);
}
else if (!timeoutId) {
timeoutId = setTimeout(trailingCall, remaining);
}
return result;
};
return debounce(func, wait, options);
}
/**
@@ -3952,7 +3980,7 @@
* // => 'nonsense'
*/
function result(object, property) {
var value = object ? object[property] : null;
var value = object ? object[property] : undefined;
return isFunction(value) ? object[property]() : value;
}
@@ -4316,6 +4344,7 @@
lodash.toArray = toArray;
lodash.union = union;
lodash.uniq = uniq;
lodash.unzip = unzip;
lodash.values = values;
lodash.where = where;
lodash.without = without;