dry-underscore
Advanced tools
Comparing version 0.7.1 to 0.8.1
@@ -6,3 +6,3 @@ // Underscore.string | ||
// Some code is borrowed from MooTools and Alexandru Marasteanu. | ||
// Version '2.3.2' | ||
// Version '2.3.3' | ||
@@ -364,3 +364,3 @@ !function(root, String){ | ||
characters = defaultToWhiteSpace(characters); | ||
return String(str).replace(new RegExp('\^' + characters + '+|' + characters + '+$', 'g'), ''); | ||
return String(str).replace(new RegExp('^' + characters + '+|' + characters + '+$', 'g'), ''); | ||
}, | ||
@@ -367,0 +367,0 @@ |
@@ -20,3 +20,3 @@ { | ||
], | ||
"main": "./lib/underscore.string", | ||
"main": "./lib/underscore.string.js", | ||
"directories": { | ||
@@ -40,2 +40,2 @@ "lib": "./lib" | ||
] | ||
} | ||
} |
{ | ||
"name" : "underscore", | ||
"description" : "JavaScript's functional programming helper library.", | ||
"homepage" : "http://underscorejs.org", | ||
"keywords" : ["util", "functional", "server", "client", "browser"], | ||
"author" : "Jeremy Ashkenas <jeremy@documentcloud.org>", | ||
"repository" : {"type": "git", "url": "git://github.com/jashkenas/underscore.git"}, | ||
"main" : "underscore.js", | ||
"version" : "1.6.0", | ||
"name": "underscore", | ||
"description": "JavaScript's functional programming helper library.", | ||
"homepage": "http://underscorejs.org", | ||
"keywords": [ | ||
"util", | ||
"functional", | ||
"server", | ||
"client", | ||
"browser" | ||
], | ||
"author": "Jeremy Ashkenas <jeremy@documentcloud.org>", | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/jashkenas/underscore.git" | ||
}, | ||
"main": "underscore.js", | ||
"version": "1.7.0", | ||
"devDependencies": { | ||
"docco": "0.6.x", | ||
"phantomjs": "1.9.0-1", | ||
"eslint": "0.6.x", | ||
"phantomjs": "~1.9.9", | ||
"uglify-js": "2.4.x" | ||
}, | ||
"scripts": { | ||
"test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true", | ||
"test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true && eslint underscore.js test/*.js test/vendor/runner.js", | ||
"build": "uglifyjs underscore.js -c \"evaluate=false\" --comments \"/ .*/\" -m --source-map underscore-min.map -o underscore-min.js", | ||
"doc": "docco underscore.js" | ||
}, | ||
"licenses": [ | ||
{ | ||
"type": "MIT", | ||
"url": "https://raw.github.com/jashkenas/underscore/master/LICENSE" | ||
} | ||
], | ||
"files" : ["underscore.js", "underscore-min.js", "LICENSE"] | ||
"license": "MIT", | ||
"files": [ | ||
"underscore.js", | ||
"underscore-min.js", | ||
"LICENSE" | ||
] | ||
} |
@@ -1,6 +0,6 @@ | ||
// Underscore.js 1.6.0 | ||
// Underscore.js 1.7.0 | ||
// http://underscorejs.org | ||
// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors | ||
// Underscore may be freely distributed under the MIT license. | ||
(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?void(this._wrapped=n):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.6.0";var A=j.each=j.forEach=function(n,t,e){if(null==n)return n;if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return;return n};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var O="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},j.find=j.detect=function(n,t,r){var e;return k(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var k=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:k(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,j.property(t))},j.where=function(n,t){return j.filter(n,j.matches(t))},j.findWhere=function(n,t){return j.find(n,j.matches(t))},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);var e=-1/0,u=-1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;o>u&&(e=n,u=o)}),e},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);var e=1/0,u=1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;u>o&&(e=n,u=o)}),e},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=j.values(n)),n[j.random(n.length-1)]):j.shuffle(n).slice(0,Math.max(0,t))};var E=function(n){return null==n?j.identity:j.isFunction(n)?n:j.property(n)};j.sortBy=function(n,t,r){return t=E(t),j.pluck(j.map(n,function(n,e,u){return{value:n,index:e,criteria:t.call(r,n,e,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=E(r),A(t,function(i,a){var o=r.call(e,i,a,t);n(u,o,i)}),u}};j.groupBy=F(function(n,t,r){j.has(n,t)?n[t].push(r):n[t]=[r]}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=E(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.partition=function(n,t){var r=[],e=[];return A(n,function(n){(t(n)?r:e).push(n)}),[r,e]},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.contains(t,n)})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===j&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:j.now(),a=null,i=n.apply(e,u),e=u=null};return function(){var l=j.now();o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u),e=u=null):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o,c=function(){var l=j.now()-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u),i=u=null))};return function(){i=this,u=arguments,a=j.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u),i=u=null),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return j.partial(t,n)},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=function(n){if(!j.isObject(n))return[];if(w)return w(n);var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o)&&"constructor"in n&&"constructor"in t)return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.constant=function(n){return function(){return n}},j.property=function(n){return function(t){return t[n]}},j.matches=function(n){return function(t){if(t===n)return!0;for(var r in n)if(n[r]!==t[r])return!1;return!0}},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},j.now=Date.now||function(){return(new Date).getTime()};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};T.unescape=j.invert(T.escape);var I={escape:new RegExp("["+j.keys(T.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(T.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(I[n],function(t){return T[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}}),"function"==typeof define&&define.amd&&define("underscore",[],function(){return j})}).call(this); | ||
(function(){var n=this,t=n._,r=Array.prototype,e=Object.prototype,u=Function.prototype,i=r.push,a=r.slice,o=r.concat,l=e.toString,c=e.hasOwnProperty,f=Array.isArray,s=Object.keys,p=u.bind,h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=h),exports._=h):n._=h,h.VERSION="1.7.0";var g=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}};h.iteratee=function(n,t,r){return null==n?h.identity:h.isFunction(n)?g(n,t,r):h.isObject(n)?h.matches(n):h.property(n)},h.each=h.forEach=function(n,t,r){if(null==n)return n;t=g(t,r);var e,u=n.length;if(u===+u)for(e=0;u>e;e++)t(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,t,r){if(null==n)return[];t=h.iteratee(t,r);for(var e,u=n.length!==+n.length&&h.keys(n),i=(u||n).length,a=Array(i),o=0;i>o;o++)e=u?u[o]:o,a[o]=t(n[e],e,n);return a};var v="Reduce of empty array with no initial value";h.reduce=h.foldl=h.inject=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length,o=0;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[o++]:o++]}for(;a>o;o++)u=i?i[o]:o,r=t(r,n[u],u,n);return r},h.reduceRight=h.foldr=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[--a]:--a]}for(;a--;)u=i?i[a]:a,r=t(r,n[u],u,n);return r},h.find=h.detect=function(n,t,r){var e;return t=h.iteratee(t,r),h.some(n,function(n,r,u){return t(n,r,u)?(e=n,!0):void 0}),e},h.filter=h.select=function(n,t,r){var e=[];return null==n?e:(t=h.iteratee(t,r),h.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e)},h.reject=function(n,t,r){return h.filter(n,h.negate(h.iteratee(t)),r)},h.every=h.all=function(n,t,r){if(null==n)return!0;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,!t(n[u],u,n))return!1;return!0},h.some=h.any=function(n,t,r){if(null==n)return!1;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,t(n[u],u,n))return!0;return!1},h.contains=h.include=function(n,t){return null==n?!1:(n.length!==+n.length&&(n=h.values(n)),h.indexOf(n,t)>=0)},h.invoke=function(n,t){var r=a.call(arguments,2),e=h.isFunction(t);return h.map(n,function(n){return(e?t:n[t]).apply(n,r)})},h.pluck=function(n,t){return h.map(n,h.property(t))},h.where=function(n,t){return h.filter(n,h.matches(t))},h.findWhere=function(n,t){return h.find(n,h.matches(t))},h.max=function(n,t,r){var e,u,i=-1/0,a=-1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],e>i&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(u>a||u===-1/0&&i===-1/0)&&(i=n,a=u)});return i},h.min=function(n,t,r){var e,u,i=1/0,a=1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],i>e&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(a>u||1/0===u&&1/0===i)&&(i=n,a=u)});return i},h.shuffle=function(n){for(var t,r=n&&n.length===+n.length?n:h.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=h.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},h.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=h.values(n)),n[h.random(n.length-1)]):h.shuffle(n).slice(0,Math.max(0,t))},h.sortBy=function(n,t,r){return t=h.iteratee(t,r),h.pluck(h.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var m=function(n){return function(t,r,e){var u={};return r=h.iteratee(r,e),h.each(t,function(e,i){var a=r(e,i,t);n(u,e,a)}),u}};h.groupBy=m(function(n,t,r){h.has(n,r)?n[r].push(t):n[r]=[t]}),h.indexBy=m(function(n,t,r){n[r]=t}),h.countBy=m(function(n,t,r){h.has(n,r)?n[r]++:n[r]=1}),h.sortedIndex=function(n,t,r,e){r=h.iteratee(r,e,1);for(var u=r(t),i=0,a=n.length;a>i;){var o=i+a>>>1;r(n[o])<u?i=o+1:a=o}return i},h.toArray=function(n){return n?h.isArray(n)?a.call(n):n.length===+n.length?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:n.length===+n.length?n.length:h.keys(n).length},h.partition=function(n,t,r){t=h.iteratee(t,r);var e=[],u=[];return h.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},h.first=h.head=h.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:a.call(n,0,t)},h.initial=function(n,t,r){return a.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},h.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:a.call(n,Math.max(n.length-t,0))},h.rest=h.tail=h.drop=function(n,t,r){return a.call(n,null==t||r?1:t)},h.compact=function(n){return h.filter(n,h.identity)};var y=function(n,t,r,e){if(t&&h.every(n,h.isArray))return o.apply(e,n);for(var u=0,a=n.length;a>u;u++){var l=n[u];h.isArray(l)||h.isArguments(l)?t?i.apply(e,l):y(l,t,r,e):r||e.push(l)}return e};h.flatten=function(n,t){return y(n,t,!1,[])},h.without=function(n){return h.difference(n,a.call(arguments,1))},h.uniq=h.unique=function(n,t,r,e){if(null==n)return[];h.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=h.iteratee(r,e));for(var u=[],i=[],a=0,o=n.length;o>a;a++){var l=n[a];if(t)a&&i===l||u.push(l),i=l;else if(r){var c=r(l,a,n);h.indexOf(i,c)<0&&(i.push(c),u.push(l))}else h.indexOf(u,l)<0&&u.push(l)}return u},h.union=function(){return h.uniq(y(arguments,!0,!0,[]))},h.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!h.contains(t,i)){for(var a=1;r>a&&h.contains(arguments[a],i);a++);a===r&&t.push(i)}}return t},h.difference=function(n){var t=y(a.call(arguments,1),!0,!0,[]);return h.filter(n,function(n){return!h.contains(t,n)})},h.zip=function(n){if(null==n)return[];for(var t=h.max(arguments,"length").length,r=Array(t),e=0;t>e;e++)r[e]=h.pluck(arguments,e);return r},h.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},h.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=h.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}for(;u>e;e++)if(n[e]===t)return e;return-1},h.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=n.length;for("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},h.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var d=function(){};h.bind=function(n,t){var r,e;if(p&&n.bind===p)return p.apply(n,a.call(arguments,1));if(!h.isFunction(n))throw new TypeError("Bind must be called on a function");return r=a.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(a.call(arguments)));d.prototype=n.prototype;var u=new d;d.prototype=null;var i=n.apply(u,r.concat(a.call(arguments)));return h.isObject(i)?i:u}},h.partial=function(n){var t=a.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===h&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},h.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=h.bind(n[r],n);return n},h.memoize=function(n,t){var r=function(e){var u=r.cache,i=t?t.apply(this,arguments):e;return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},h.delay=function(n,t){var r=a.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},h.defer=function(n){return h.delay.apply(h,[n,1].concat(a.call(arguments,1)))},h.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var l=function(){o=r.leading===!1?0:h.now(),a=null,i=n.apply(e,u),a||(e=u=null)};return function(){var c=h.now();o||r.leading!==!1||(o=c);var f=t-(c-o);return e=this,u=arguments,0>=f||f>t?(clearTimeout(a),a=null,o=c,i=n.apply(e,u),a||(e=u=null)):a||r.trailing===!1||(a=setTimeout(l,f)),i}},h.debounce=function(n,t,r){var e,u,i,a,o,l=function(){var c=h.now()-a;t>c&&c>0?e=setTimeout(l,t-c):(e=null,r||(o=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,a=h.now();var c=r&&!e;return e||(e=setTimeout(l,t)),c&&(o=n.apply(i,u),i=u=null),o}},h.wrap=function(n,t){return h.partial(t,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},h.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},h.before=function(n,t){var r;return function(){return--n>0?r=t.apply(this,arguments):t=null,r}},h.once=h.partial(h.before,2),h.keys=function(n){if(!h.isObject(n))return[];if(s)return s(n);var t=[];for(var r in n)h.has(n,r)&&t.push(r);return t},h.values=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},h.pairs=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},h.invert=function(n){for(var t={},r=h.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},h.functions=h.methods=function(n){var t=[];for(var r in n)h.isFunction(n[r])&&t.push(r);return t.sort()},h.extend=function(n){if(!h.isObject(n))return n;for(var t,r,e=1,u=arguments.length;u>e;e++){t=arguments[e];for(r in t)c.call(t,r)&&(n[r]=t[r])}return n},h.pick=function(n,t,r){var e,u={};if(null==n)return u;if(h.isFunction(t)){t=g(t,r);for(e in n){var i=n[e];t(i,e,n)&&(u[e]=i)}}else{var l=o.apply([],a.call(arguments,1));n=new Object(n);for(var c=0,f=l.length;f>c;c++)e=l[c],e in n&&(u[e]=n[e])}return u},h.omit=function(n,t,r){if(h.isFunction(t))t=h.negate(t);else{var e=h.map(o.apply([],a.call(arguments,1)),String);t=function(n,t){return!h.contains(e,t)}}return h.pick(n,t,r)},h.defaults=function(n){if(!h.isObject(n))return n;for(var t=1,r=arguments.length;r>t;t++){var e=arguments[t];for(var u in e)n[u]===void 0&&(n[u]=e[u])}return n},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,t){return t(n),n};var b=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof h&&(n=n._wrapped),t instanceof h&&(t=t._wrapped);var u=l.call(n);if(u!==l.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]===n)return e[i]===t;var a=n.constructor,o=t.constructor;if(a!==o&&"constructor"in n&&"constructor"in t&&!(h.isFunction(a)&&a instanceof a&&h.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c,f;if("[object Array]"===u){if(c=n.length,f=c===t.length)for(;c--&&(f=b(n[c],t[c],r,e)););}else{var s,p=h.keys(n);if(c=p.length,f=h.keys(t).length===c)for(;c--&&(s=p[c],f=h.has(t,s)&&b(n[s],t[s],r,e)););}return r.pop(),e.pop(),f};h.isEqual=function(n,t){return b(n,t,[],[])},h.isEmpty=function(n){if(null==n)return!0;if(h.isArray(n)||h.isString(n)||h.isArguments(n))return 0===n.length;for(var t in n)if(h.has(n,t))return!1;return!0},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=f||function(n){return"[object Array]"===l.call(n)},h.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp"],function(n){h["is"+n]=function(t){return l.call(t)==="[object "+n+"]"}}),h.isArguments(arguments)||(h.isArguments=function(n){return h.has(n,"callee")}),"function"!=typeof/./&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&n!==+n},h.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===l.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,t){return null!=n&&c.call(n,t)},h.noConflict=function(){return n._=t,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return function(t){return t[n]}},h.matches=function(n){var t=h.pairs(n),r=t.length;return function(n){if(null==n)return!r;n=new Object(n);for(var e=0;r>e;e++){var u=t[e],i=u[0];if(u[1]!==n[i]||!(i in n))return!1}return!0}},h.times=function(n,t,r){var e=Array(Math.max(0,n));t=g(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},h.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var _={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},w=h.invert(_),j=function(n){var t=function(t){return n[t]},r="(?:"+h.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=j(_),h.unescape=j(w),h.result=function(n,t){if(null==n)return void 0;var r=n[t];return h.isFunction(r)?n[t]():r};var x=0;h.uniqueId=function(n){var t=++x+"";return n?n+t:t},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var A=/(.)^/,k={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},O=/\\|'|\r|\n|\u2028|\u2029/g,F=function(n){return"\\"+k[n]};h.template=function(n,t,r){!t&&r&&(t=r),t=h.defaults({},t,h.templateSettings);var e=RegExp([(t.escape||A).source,(t.interpolate||A).source,(t.evaluate||A).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(O,F),u=o+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":a&&(i+="';\n"+a+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=new Function(t.variable||"obj","_",i)}catch(o){throw o.source=i,o}var l=function(n){return a.call(this,n,h)},c=t.variable||"obj";return l.source="function("+c+"){\n"+i+"}",l},h.chain=function(n){var t=h(n);return t._chain=!0,t};var E=function(n){return this._chain?h(n).chain():n};h.mixin=function(n){h.each(h.functions(n),function(t){var r=h[t]=n[t];h.prototype[t]=function(){var n=[this._wrapped];return i.apply(n,arguments),E.call(this,r.apply(h,n))}})},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=r[n];h.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],E.call(this,r)}}),h.each(["concat","join","slice"],function(n){var t=r[n];h.prototype[n]=function(){return E.call(this,t.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}).call(this); | ||
//# sourceMappingURL=underscore-min.map |
@@ -1,2 +0,2 @@ | ||
// Underscore.js 1.6.0 | ||
// Underscore.js 1.7.0 | ||
// http://underscorejs.org | ||
@@ -17,5 +17,2 @@ // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors | ||
// Establish the object that gets returned to break out of a loop iteration. | ||
var breaker = {}; | ||
// Save bytes in the minified (but not gzipped) version: | ||
@@ -28,3 +25,2 @@ var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; | ||
slice = ArrayProto.slice, | ||
concat = ArrayProto.concat, | ||
toString = ObjProto.toString, | ||
@@ -36,11 +32,2 @@ hasOwnProperty = ObjProto.hasOwnProperty; | ||
var | ||
nativeForEach = ArrayProto.forEach, | ||
nativeMap = ArrayProto.map, | ||
nativeReduce = ArrayProto.reduce, | ||
nativeReduceRight = ArrayProto.reduceRight, | ||
nativeFilter = ArrayProto.filter, | ||
nativeEvery = ArrayProto.every, | ||
nativeSome = ArrayProto.some, | ||
nativeIndexOf = ArrayProto.indexOf, | ||
nativeLastIndexOf = ArrayProto.lastIndexOf, | ||
nativeIsArray = Array.isArray, | ||
@@ -59,4 +46,3 @@ nativeKeys = Object.keys, | ||
// backwards-compatibility for the old `require()` API. If we're in | ||
// the browser, add `_` as a global object via a string identifier, | ||
// for Closure Compiler "advanced" mode. | ||
// the browser, add `_` as a global object. | ||
if (typeof exports !== 'undefined') { | ||
@@ -72,4 +58,41 @@ if (typeof module !== 'undefined' && module.exports) { | ||
// Current version. | ||
_.VERSION = '1.6.0'; | ||
_.VERSION = '1.7.0'; | ||
// Internal function that returns an efficient (for current engines) version | ||
// of the passed-in callback, to be repeatedly applied in other Underscore | ||
// functions. | ||
var optimizeCb = function(func, context, argCount) { | ||
if (context === void 0) return func; | ||
switch (argCount == null ? 3 : argCount) { | ||
case 1: return function(value) { | ||
return func.call(context, value); | ||
}; | ||
case 2: return function(value, other) { | ||
return func.call(context, value, other); | ||
}; | ||
case 3: return function(value, index, collection) { | ||
return func.call(context, value, index, collection); | ||
}; | ||
case 4: return function(accumulator, value, index, collection) { | ||
return func.call(context, accumulator, value, index, collection); | ||
}; | ||
} | ||
return function() { | ||
return func.apply(context, arguments); | ||
}; | ||
}; | ||
// A mostly-internal function to generate callbacks that can be applied | ||
// to each element in a collection, returning the desired result — either | ||
// identity, an arbitrary callback, a property matcher, or a property accessor. | ||
var cb = function(value, context, argCount) { | ||
if (value == null) return _.identity; | ||
if (_.isFunction(value)) return optimizeCb(value, context, argCount); | ||
if (_.isObject(value)) return _.matches(value); | ||
return _.property(value); | ||
}; | ||
_.iteratee = function(value, context) { | ||
return cb(value, context); | ||
}; | ||
// Collection Functions | ||
@@ -79,16 +102,16 @@ // -------------------- | ||
// The cornerstone, an `each` implementation, aka `forEach`. | ||
// Handles objects with the built-in `forEach`, arrays, and raw objects. | ||
// Delegates to **ECMAScript 5**'s native `forEach` if available. | ||
var each = _.each = _.forEach = function(obj, iterator, context) { | ||
// Handles raw objects in addition to array-likes. Treats all | ||
// sparse array-likes as if they were dense. | ||
_.each = _.forEach = function(obj, iteratee, context) { | ||
if (obj == null) return obj; | ||
if (nativeForEach && obj.forEach === nativeForEach) { | ||
obj.forEach(iterator, context); | ||
} else if (!_.isFunction(obj) && obj.length === +obj.length) { | ||
for (var i = 0, l = obj.length; i < l; i++) { | ||
if (iterator.call(context, obj[i], i, obj) === breaker) return; | ||
iteratee = optimizeCb(iteratee, context); | ||
var i, length = obj.length; | ||
if (!_.isFunction(obj) && length === +length) { | ||
for (i = 0; i < length; i++) { | ||
iteratee(obj[i], i, obj); | ||
} | ||
} else { | ||
var keys = _.keys(obj); | ||
for (var i = 0, length = keys.length; i < length; i++) { | ||
if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; | ||
for (i = 0, length = keys.length; i < length; i++) { | ||
iteratee(obj[keys[i]], keys[i], obj); | ||
} | ||
@@ -99,11 +122,14 @@ } | ||
// Return the results of applying the iterator to each element. | ||
// Delegates to **ECMAScript 5**'s native `map` if available. | ||
_.map = _.collect = function(obj, iterator, context) { | ||
var results = []; | ||
if (obj == null) return results; | ||
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); | ||
each(obj, function(value, index, list) { | ||
results.push(iterator.call(context, value, index, list)); | ||
}); | ||
// Return the results of applying the iteratee to each element. | ||
_.map = _.collect = function(obj, iteratee, context) { | ||
if (obj == null) return []; | ||
iteratee = cb(iteratee, context); | ||
var keys = obj.length !== +obj.length && _.keys(obj), | ||
length = (keys || obj).length, | ||
results = Array(length), | ||
currentKey; | ||
for (var index = 0; index < length; index++) { | ||
currentKey = keys ? keys[index] : index; | ||
results[index] = iteratee(obj[currentKey], currentKey, obj); | ||
} | ||
return results; | ||
@@ -115,19 +141,17 @@ }; | ||
// **Reduce** builds up a single result from a list of values, aka `inject`, | ||
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. | ||
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { | ||
var initial = arguments.length > 2; | ||
// or `foldl`. | ||
_.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) { | ||
if (obj == null) obj = []; | ||
if (nativeReduce && obj.reduce === nativeReduce) { | ||
if (context) iterator = _.bind(iterator, context); | ||
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); | ||
iteratee = optimizeCb(iteratee, context, 4); | ||
var keys = obj.length !== +obj.length && _.keys(obj), | ||
length = (keys || obj).length, | ||
index = 0, currentKey; | ||
if (arguments.length < 3) { | ||
if (!length) throw new TypeError(reduceError); | ||
memo = obj[keys ? keys[index++] : index++]; | ||
} | ||
each(obj, function(value, index, list) { | ||
if (!initial) { | ||
memo = value; | ||
initial = true; | ||
} else { | ||
memo = iterator.call(context, memo, value, index, list); | ||
} | ||
}); | ||
if (!initial) throw new TypeError(reduceError); | ||
for (; index < length; index++) { | ||
currentKey = keys ? keys[index] : index; | ||
memo = iteratee(memo, obj[currentKey], currentKey, obj); | ||
} | ||
return memo; | ||
@@ -137,25 +161,16 @@ }; | ||
// The right-associative version of reduce, also known as `foldr`. | ||
// Delegates to **ECMAScript 5**'s native `reduceRight` if available. | ||
_.reduceRight = _.foldr = function(obj, iterator, memo, context) { | ||
var initial = arguments.length > 2; | ||
_.reduceRight = _.foldr = function(obj, iteratee, memo, context) { | ||
if (obj == null) obj = []; | ||
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { | ||
if (context) iterator = _.bind(iterator, context); | ||
return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); | ||
iteratee = optimizeCb(iteratee, context, 4); | ||
var keys = obj.length !== + obj.length && _.keys(obj), | ||
index = (keys || obj).length, | ||
currentKey; | ||
if (arguments.length < 3) { | ||
if (!index) throw new TypeError(reduceError); | ||
memo = obj[keys ? keys[--index] : --index]; | ||
} | ||
var length = obj.length; | ||
if (length !== +length) { | ||
var keys = _.keys(obj); | ||
length = keys.length; | ||
while (index--) { | ||
currentKey = keys ? keys[index] : index; | ||
memo = iteratee(memo, obj[currentKey], currentKey, obj); | ||
} | ||
each(obj, function(value, index, list) { | ||
index = keys ? keys[--length] : --length; | ||
if (!initial) { | ||
memo = obj[index]; | ||
initial = true; | ||
} else { | ||
memo = iterator.call(context, memo, obj[index], index, list); | ||
} | ||
}); | ||
if (!initial) throw new TypeError(reduceError); | ||
return memo; | ||
@@ -167,4 +182,5 @@ }; | ||
var result; | ||
any(obj, function(value, index, list) { | ||
if (predicate.call(context, value, index, list)) { | ||
predicate = cb(predicate, context); | ||
_.some(obj, function(value, index, list) { | ||
if (predicate(value, index, list)) { | ||
result = value; | ||
@@ -178,3 +194,2 @@ return true; | ||
// Return all the elements that pass a truth test. | ||
// Delegates to **ECMAScript 5**'s native `filter` if available. | ||
// Aliased as `select`. | ||
@@ -184,5 +199,5 @@ _.filter = _.select = function(obj, predicate, context) { | ||
if (obj == null) return results; | ||
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context); | ||
each(obj, function(value, index, list) { | ||
if (predicate.call(context, value, index, list)) results.push(value); | ||
predicate = cb(predicate, context); | ||
_.each(obj, function(value, index, list) { | ||
if (predicate(value, index, list)) results.push(value); | ||
}); | ||
@@ -194,33 +209,33 @@ return results; | ||
_.reject = function(obj, predicate, context) { | ||
return _.filter(obj, function(value, index, list) { | ||
return !predicate.call(context, value, index, list); | ||
}, context); | ||
return _.filter(obj, _.negate(cb(predicate)), context); | ||
}; | ||
// Determine whether all of the elements match a truth test. | ||
// Delegates to **ECMAScript 5**'s native `every` if available. | ||
// Aliased as `all`. | ||
_.every = _.all = function(obj, predicate, context) { | ||
predicate || (predicate = _.identity); | ||
var result = true; | ||
if (obj == null) return result; | ||
if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context); | ||
each(obj, function(value, index, list) { | ||
if (!(result = result && predicate.call(context, value, index, list))) return breaker; | ||
}); | ||
return !!result; | ||
if (obj == null) return true; | ||
predicate = cb(predicate, context); | ||
var keys = obj.length !== +obj.length && _.keys(obj), | ||
length = (keys || obj).length, | ||
index, currentKey; | ||
for (index = 0; index < length; index++) { | ||
currentKey = keys ? keys[index] : index; | ||
if (!predicate(obj[currentKey], currentKey, obj)) return false; | ||
} | ||
return true; | ||
}; | ||
// Determine if at least one element in the object matches a truth test. | ||
// Delegates to **ECMAScript 5**'s native `some` if available. | ||
// Aliased as `any`. | ||
var any = _.some = _.any = function(obj, predicate, context) { | ||
predicate || (predicate = _.identity); | ||
var result = false; | ||
if (obj == null) return result; | ||
if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context); | ||
each(obj, function(value, index, list) { | ||
if (result || (result = predicate.call(context, value, index, list))) return breaker; | ||
}); | ||
return !!result; | ||
_.some = _.any = function(obj, predicate, context) { | ||
if (obj == null) return false; | ||
predicate = cb(predicate, context); | ||
var keys = obj.length !== +obj.length && _.keys(obj), | ||
length = (keys || obj).length, | ||
index, currentKey; | ||
for (index = 0; index < length; index++) { | ||
currentKey = keys ? keys[index] : index; | ||
if (predicate(obj[currentKey], currentKey, obj)) return true; | ||
} | ||
return false; | ||
}; | ||
@@ -232,6 +247,4 @@ | ||
if (obj == null) return false; | ||
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; | ||
return any(obj, function(value) { | ||
return value === target; | ||
}); | ||
if (obj.length !== +obj.length) obj = _.values(obj); | ||
return _.indexOf(obj, target) >= 0; | ||
}; | ||
@@ -265,17 +278,24 @@ | ||
// Return the maximum element or (element-based computation). | ||
// Can't optimize arrays of integers longer than 65,535 elements. | ||
// See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797) | ||
_.max = function(obj, iterator, context) { | ||
if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { | ||
return Math.max.apply(Math, obj); | ||
// Return the maximum element (or element-based computation). | ||
_.max = function(obj, iteratee, context) { | ||
var result = -Infinity, lastComputed = -Infinity, | ||
value, computed; | ||
if (iteratee == null && obj != null) { | ||
obj = obj.length === +obj.length ? obj : _.values(obj); | ||
for (var i = 0, length = obj.length; i < length; i++) { | ||
value = obj[i]; | ||
if (value > result) { | ||
result = value; | ||
} | ||
} | ||
} else { | ||
iteratee = cb(iteratee, context); | ||
_.each(obj, function(value, index, list) { | ||
computed = iteratee(value, index, list); | ||
if (computed > lastComputed || computed === -Infinity && result === -Infinity) { | ||
result = value; | ||
lastComputed = computed; | ||
} | ||
}); | ||
} | ||
var result = -Infinity, lastComputed = -Infinity; | ||
each(obj, function(value, index, list) { | ||
var computed = iterator ? iterator.call(context, value, index, list) : value; | ||
if (computed > lastComputed) { | ||
result = value; | ||
lastComputed = computed; | ||
} | ||
}); | ||
return result; | ||
@@ -285,28 +305,37 @@ }; | ||
// Return the minimum element (or element-based computation). | ||
_.min = function(obj, iterator, context) { | ||
if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { | ||
return Math.min.apply(Math, obj); | ||
_.min = function(obj, iteratee, context) { | ||
var result = Infinity, lastComputed = Infinity, | ||
value, computed; | ||
if (iteratee == null && obj != null) { | ||
obj = obj.length === +obj.length ? obj : _.values(obj); | ||
for (var i = 0, length = obj.length; i < length; i++) { | ||
value = obj[i]; | ||
if (value < result) { | ||
result = value; | ||
} | ||
} | ||
} else { | ||
iteratee = cb(iteratee, context); | ||
_.each(obj, function(value, index, list) { | ||
computed = iteratee(value, index, list); | ||
if (computed < lastComputed || computed === Infinity && result === Infinity) { | ||
result = value; | ||
lastComputed = computed; | ||
} | ||
}); | ||
} | ||
var result = Infinity, lastComputed = Infinity; | ||
each(obj, function(value, index, list) { | ||
var computed = iterator ? iterator.call(context, value, index, list) : value; | ||
if (computed < lastComputed) { | ||
result = value; | ||
lastComputed = computed; | ||
} | ||
}); | ||
return result; | ||
}; | ||
// Shuffle an array, using the modern version of the | ||
// Shuffle a collection, using the modern version of the | ||
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). | ||
_.shuffle = function(obj) { | ||
var rand; | ||
var index = 0; | ||
var shuffled = []; | ||
each(obj, function(value) { | ||
rand = _.random(index++); | ||
shuffled[index - 1] = shuffled[rand]; | ||
shuffled[rand] = value; | ||
}); | ||
var set = obj && obj.length === +obj.length ? obj : _.values(obj); | ||
var length = set.length; | ||
var shuffled = Array(length); | ||
for (var index = 0, rand; index < length; index++) { | ||
rand = _.random(0, index); | ||
if (rand !== index) shuffled[index] = shuffled[rand]; | ||
shuffled[rand] = set[index]; | ||
} | ||
return shuffled; | ||
@@ -326,12 +355,5 @@ }; | ||
// An internal function to generate lookup iterators. | ||
var lookupIterator = function(value) { | ||
if (value == null) return _.identity; | ||
if (_.isFunction(value)) return value; | ||
return _.property(value); | ||
}; | ||
// Sort the object's values by a criterion produced by an iterator. | ||
_.sortBy = function(obj, iterator, context) { | ||
iterator = lookupIterator(iterator); | ||
// Sort the object's values by a criterion produced by an iteratee. | ||
_.sortBy = function(obj, iteratee, context) { | ||
iteratee = cb(iteratee, context); | ||
return _.pluck(_.map(obj, function(value, index, list) { | ||
@@ -341,3 +363,3 @@ return { | ||
index: index, | ||
criteria: iterator.call(context, value, index, list) | ||
criteria: iteratee(value, index, list) | ||
}; | ||
@@ -357,8 +379,8 @@ }).sort(function(left, right) { | ||
var group = function(behavior) { | ||
return function(obj, iterator, context) { | ||
return function(obj, iteratee, context) { | ||
var result = {}; | ||
iterator = lookupIterator(iterator); | ||
each(obj, function(value, index) { | ||
var key = iterator.call(context, value, index, obj); | ||
behavior(result, key, value); | ||
iteratee = cb(iteratee, context); | ||
_.each(obj, function(value, index) { | ||
var key = iteratee(value, index, obj); | ||
behavior(result, value, key); | ||
}); | ||
@@ -371,4 +393,4 @@ return result; | ||
// to group by, or a function that returns the criterion. | ||
_.groupBy = group(function(result, key, value) { | ||
_.has(result, key) ? result[key].push(value) : result[key] = [value]; | ||
_.groupBy = group(function(result, value, key) { | ||
if (_.has(result, key)) result[key].push(value); else result[key] = [value]; | ||
}); | ||
@@ -378,3 +400,3 @@ | ||
// when you know that your index values will be unique. | ||
_.indexBy = group(function(result, key, value) { | ||
_.indexBy = group(function(result, value, key) { | ||
result[key] = value; | ||
@@ -386,4 +408,4 @@ }); | ||
// criterion. | ||
_.countBy = group(function(result, key) { | ||
_.has(result, key) ? result[key]++ : result[key] = 1; | ||
_.countBy = group(function(result, value, key) { | ||
if (_.has(result, key)) result[key]++; else result[key] = 1; | ||
}); | ||
@@ -393,9 +415,9 @@ | ||
// an object should be inserted so as to maintain order. Uses binary search. | ||
_.sortedIndex = function(array, obj, iterator, context) { | ||
iterator = lookupIterator(iterator); | ||
var value = iterator.call(context, obj); | ||
_.sortedIndex = function(array, obj, iteratee, context) { | ||
iteratee = cb(iteratee, context, 1); | ||
var value = iteratee(obj); | ||
var low = 0, high = array.length; | ||
while (low < high) { | ||
var mid = (low + high) >>> 1; | ||
iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; | ||
var mid = low + high >>> 1; | ||
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; | ||
} | ||
@@ -416,5 +438,16 @@ return low; | ||
if (obj == null) return 0; | ||
return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; | ||
return obj.length === +obj.length ? obj.length : _.keys(obj).length; | ||
}; | ||
// Split a collection into two arrays: one whose elements all satisfy the given | ||
// predicate, and one whose elements all do not satisfy the predicate. | ||
_.partition = function(obj, predicate, context) { | ||
predicate = cb(predicate, context); | ||
var pass = [], fail = []; | ||
_.each(obj, function(value, key, obj) { | ||
(predicate(value, key, obj) ? pass : fail).push(value); | ||
}); | ||
return [pass, fail]; | ||
}; | ||
// Array Functions | ||
@@ -428,5 +461,4 @@ // --------------- | ||
if (array == null) return void 0; | ||
if ((n == null) || guard) return array[0]; | ||
if (n < 0) return []; | ||
return slice.call(array, 0, n); | ||
if (n == null || guard) return array[0]; | ||
return _.initial(array, array.length - n); | ||
}; | ||
@@ -439,3 +471,3 @@ | ||
_.initial = function(array, n, guard) { | ||
return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); | ||
return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); | ||
}; | ||
@@ -447,4 +479,4 @@ | ||
if (array == null) return void 0; | ||
if ((n == null) || guard) return array[array.length - 1]; | ||
return slice.call(array, Math.max(array.length - n, 0)); | ||
if (n == null || guard) return array[array.length - 1]; | ||
return _.rest(array, Math.max(0, array.length - n)); | ||
}; | ||
@@ -457,3 +489,3 @@ | ||
_.rest = _.tail = _.drop = function(array, n, guard) { | ||
return slice.call(array, (n == null) || guard ? 1 : n); | ||
return slice.call(array, n == null || guard ? 1 : n); | ||
}; | ||
@@ -467,14 +499,16 @@ | ||
// Internal implementation of a recursive `flatten` function. | ||
var flatten = function(input, shallow, strict, output) { | ||
if (shallow && _.every(input, _.isArray)) { | ||
return concat.apply(output, input); | ||
} | ||
for (var i = 0, length = input.length; i < length; i++) { | ||
var value = input[i]; | ||
if (!_.isArray(value) && !_.isArguments(value)) { | ||
if (!strict) output.push(value); | ||
} else if (shallow) { | ||
push.apply(output, value); | ||
} else { | ||
flatten(value, shallow, strict, output); | ||
var flatten = function(input, shallow, strict, startIndex) { | ||
var output = [], idx = 0, value; | ||
for (var i = startIndex || 0, length = input && input.length; i < length; i++) { | ||
value = input[i]; | ||
if (value && value.length >= 0 && (_.isArray(value) || _.isArguments(value))) { | ||
//flatten current level of array or arguments object | ||
if (!shallow) value = flatten(value, shallow, strict); | ||
var j = 0, len = value.length; | ||
output.length += len; | ||
while (j < len) { | ||
output[idx++] = value[j++]; | ||
} | ||
} else if (!strict) { | ||
output[idx++] = value; | ||
} | ||
@@ -487,3 +521,3 @@ } | ||
_.flatten = function(array, shallow) { | ||
return flatten(array, shallow, false, []); | ||
return flatten(array, shallow, false); | ||
}; | ||
@@ -496,32 +530,28 @@ | ||
// Split an array into two arrays: one whose elements all satisfy the given | ||
// predicate, and one whose elements all do not satisfy the predicate. | ||
_.partition = function(obj, predicate, context) { | ||
predicate = lookupIterator(predicate); | ||
var pass = [], fail = []; | ||
each(obj, function(elem) { | ||
(predicate.call(context, elem) ? pass : fail).push(elem); | ||
}); | ||
return [pass, fail]; | ||
}; | ||
// Produce a duplicate-free version of the array. If the array has already | ||
// been sorted, you have the option of using a faster algorithm. | ||
// Aliased as `unique`. | ||
_.uniq = _.unique = function(array, isSorted, iterator, context) { | ||
_.uniq = _.unique = function(array, isSorted, iteratee, context) { | ||
if (array == null) return []; | ||
if (_.isFunction(isSorted)) { | ||
context = iterator; | ||
iterator = isSorted; | ||
if (!_.isBoolean(isSorted)) { | ||
context = iteratee; | ||
iteratee = isSorted; | ||
isSorted = false; | ||
} | ||
if (iteratee != null) iteratee = cb(iteratee, context); | ||
var result = []; | ||
var seen = []; | ||
for (var i = 0, length = array.length; i < length; i++) { | ||
var value = array[i]; | ||
if (iterator) value = iterator.call(context, value, i, array); | ||
if (isSorted ? (!i || seen !== value) : !_.contains(seen, value)) { | ||
if (isSorted) seen = value; | ||
else seen.push(value); | ||
result.push(array[i]); | ||
var value = array[i], | ||
computed = iteratee ? iteratee(value, i, array) : value; | ||
if (isSorted) { | ||
if (!i || seen !== computed) result.push(value); | ||
seen = computed; | ||
} else if (iteratee) { | ||
if (!_.contains(seen, computed)) { | ||
seen.push(computed); | ||
result.push(value); | ||
} | ||
} else if (!_.contains(result, value)) { | ||
result.push(value); | ||
} | ||
@@ -535,3 +565,3 @@ } | ||
_.union = function() { | ||
return _.uniq(flatten(arguments, true, true, [])); | ||
return _.uniq(flatten(arguments, true, true)); | ||
}; | ||
@@ -542,8 +572,14 @@ | ||
_.intersection = function(array) { | ||
var rest = slice.call(arguments, 1); | ||
return _.filter(_.uniq(array), function(item) { | ||
return _.every(rest, function(other) { | ||
return _.contains(other, item); | ||
}); | ||
}); | ||
if (array == null) return []; | ||
var result = []; | ||
var argsLength = arguments.length; | ||
for (var i = 0, length = array.length; i < length; i++) { | ||
var item = array[i]; | ||
if (_.contains(result, item)) continue; | ||
for (var j = 1; j < argsLength; j++) { | ||
if (!_.contains(arguments[j], item)) break; | ||
} | ||
if (j === argsLength) result.push(item); | ||
} | ||
return result; | ||
}; | ||
@@ -554,4 +590,6 @@ | ||
_.difference = function(array) { | ||
var rest = flatten(slice.call(arguments, 1), true, true, []); | ||
return _.filter(array, function(value){ return !_.contains(rest, value); }); | ||
var rest = flatten(arguments, true, true, 1); | ||
return _.filter(array, function(value){ | ||
return !_.contains(rest, value); | ||
}); | ||
}; | ||
@@ -561,7 +599,8 @@ | ||
// an index go together. | ||
_.zip = function() { | ||
var length = _.max(_.pluck(arguments, 'length').concat(0)); | ||
var results = new Array(length); | ||
for (var i = 0; i < length; i++) { | ||
results[i] = _.pluck(arguments, '' + i); | ||
_.zip = function(array) { | ||
if (array == null) return []; | ||
var length = _.max(arguments, 'length').length; | ||
var results = Array(length); | ||
while (length-- > 0) { | ||
results[length] = _.pluck(arguments, length); | ||
} | ||
@@ -571,2 +610,8 @@ return results; | ||
// Complement of _.zip. Unzip accepts an array of arrays and groups | ||
// each array's elements on shared indices | ||
_.unzip = function(array) { | ||
return _.zip.apply(null, array); | ||
}; | ||
// Converts lists into objects. Pass either a single array of `[key, value]` | ||
@@ -588,20 +633,14 @@ // pairs, or two parallel arrays of the same length -- one of keys, and one of | ||
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), | ||
// we need this function. Return the position of the first occurrence of an | ||
// item in an array, or -1 if the item is not included in the array. | ||
// Delegates to **ECMAScript 5**'s native `indexOf` if available. | ||
// Return the position of the first occurrence of an item in an array, | ||
// or -1 if the item is not included in the array. | ||
// If the array is large and already in sort order, pass `true` | ||
// for **isSorted** to use binary search. | ||
_.indexOf = function(array, item, isSorted) { | ||
if (array == null) return -1; | ||
var i = 0, length = array.length; | ||
if (isSorted) { | ||
if (typeof isSorted == 'number') { | ||
i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); | ||
} else { | ||
i = _.sortedIndex(array, item); | ||
return array[i] === item ? i : -1; | ||
} | ||
var i = 0, length = array && array.length; | ||
if (typeof isSorted == 'number') { | ||
i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted; | ||
} else if (isSorted) { | ||
i = _.sortedIndex(array, item); | ||
return array[i] === item ? i : -1; | ||
} | ||
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); | ||
for (; i < length; i++) if (array[i] === item) return i; | ||
@@ -611,11 +650,8 @@ return -1; | ||
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. | ||
_.lastIndexOf = function(array, item, from) { | ||
if (array == null) return -1; | ||
var hasIndex = from != null; | ||
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { | ||
return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); | ||
var idx = array ? array.length : 0; | ||
if (typeof from == 'number') { | ||
idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1); | ||
} | ||
var i = (hasIndex ? from : array.length); | ||
while (i--) if (array[i] === item) return i; | ||
while (--idx >= 0) if (array[idx] === item) return idx; | ||
return -1; | ||
@@ -632,11 +668,9 @@ }; | ||
} | ||
step = arguments[2] || 1; | ||
step = step || 1; | ||
var length = Math.max(Math.ceil((stop - start) / step), 0); | ||
var idx = 0; | ||
var range = new Array(length); | ||
var range = Array(length); | ||
while(idx < length) { | ||
range[idx++] = start; | ||
start += step; | ||
for (var idx = 0; idx < length; idx++, start += step) { | ||
range[idx] = start; | ||
} | ||
@@ -651,4 +685,16 @@ | ||
// Reusable constructor function for prototype setting. | ||
var ctor = function(){}; | ||
var Ctor = function(){}; | ||
// Determines whether to execute a function as a constructor | ||
// or a normal function with the provided arguments | ||
var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { | ||
if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); | ||
Ctor.prototype = sourceFunc.prototype; | ||
var self = new Ctor; | ||
Ctor.prototype = null; | ||
var result = sourceFunc.apply(self, args); | ||
if (_.isObject(result)) return result; | ||
return self; | ||
}; | ||
// Create a function bound to a given object (assigning `this`, and arguments, | ||
@@ -658,14 +704,7 @@ // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if | ||
_.bind = function(func, context) { | ||
var args, bound; | ||
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); | ||
if (!_.isFunction(func)) throw new TypeError; | ||
args = slice.call(arguments, 2); | ||
return bound = function() { | ||
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); | ||
ctor.prototype = func.prototype; | ||
var self = new ctor; | ||
ctor.prototype = null; | ||
var result = func.apply(self, args.concat(slice.call(arguments))); | ||
if (Object(result) === result) return result; | ||
return self; | ||
if (!_.isFunction(func)) throw TypeError('Bind must be called on a function'); | ||
var args = slice.call(arguments, 2); | ||
return function bound() { | ||
return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); | ||
}; | ||
@@ -679,3 +718,3 @@ }; | ||
var boundArgs = slice.call(arguments, 1); | ||
return function() { | ||
return function bound() { | ||
var position = 0; | ||
@@ -687,3 +726,3 @@ var args = boundArgs.slice(); | ||
while (position < arguments.length) args.push(arguments[position++]); | ||
return func.apply(this, args); | ||
return executeBound(func, bound, this, this, args); | ||
}; | ||
@@ -696,5 +735,8 @@ }; | ||
_.bindAll = function(obj) { | ||
var funcs = slice.call(arguments, 1); | ||
if (funcs.length === 0) throw new Error('bindAll must be passed function names'); | ||
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); | ||
var i, length = arguments.length, key; | ||
if (length <= 1) throw new Error('bindAll must be passed function names'); | ||
for (i = 1; i < length; i++) { | ||
key = arguments[i]; | ||
obj[key] = _.bind(obj[key], obj); | ||
} | ||
return obj; | ||
@@ -705,8 +747,10 @@ }; | ||
_.memoize = function(func, hasher) { | ||
var memo = {}; | ||
hasher || (hasher = _.identity); | ||
return function() { | ||
var key = hasher.apply(this, arguments); | ||
return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); | ||
var memoize = function(key) { | ||
var cache = memoize.cache; | ||
var address = '' + (hasher ? hasher.apply(this, arguments) : key); | ||
if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); | ||
return cache[address]; | ||
}; | ||
memoize.cache = {}; | ||
return memoize; | ||
}; | ||
@@ -718,3 +762,5 @@ | ||
var args = slice.call(arguments, 2); | ||
return setTimeout(function(){ return func.apply(null, args); }, wait); | ||
return setTimeout(function(){ | ||
return func.apply(null, args); | ||
}, wait); | ||
}; | ||
@@ -737,3 +783,3 @@ | ||
var previous = 0; | ||
options || (options = {}); | ||
if (!options) options = {}; | ||
var later = function() { | ||
@@ -743,3 +789,3 @@ previous = options.leading === false ? 0 : _.now(); | ||
result = func.apply(context, args); | ||
context = args = null; | ||
if (!timeout) context = args = null; | ||
}; | ||
@@ -752,8 +798,10 @@ return function() { | ||
args = arguments; | ||
if (remaining <= 0) { | ||
clearTimeout(timeout); | ||
timeout = null; | ||
if (remaining <= 0 || remaining > wait) { | ||
if (timeout) { | ||
clearTimeout(timeout); | ||
timeout = null; | ||
} | ||
previous = now; | ||
result = func.apply(context, args); | ||
context = args = null; | ||
if (!timeout) context = args = null; | ||
} else if (!timeout && options.trailing !== false) { | ||
@@ -775,3 +823,4 @@ timeout = setTimeout(later, remaining); | ||
var last = _.now() - timestamp; | ||
if (last < wait) { | ||
if (last < wait && last >= 0) { | ||
timeout = setTimeout(later, wait - last); | ||
@@ -782,3 +831,3 @@ } else { | ||
result = func.apply(context, args); | ||
context = args = null; | ||
if (!timeout) context = args = null; | ||
} | ||
@@ -793,5 +842,3 @@ } | ||
var callNow = immediate && !timeout; | ||
if (!timeout) { | ||
timeout = setTimeout(later, wait); | ||
} | ||
if (!timeout) timeout = setTimeout(later, wait); | ||
if (callNow) { | ||
@@ -806,15 +853,2 @@ result = func.apply(context, args); | ||
// Returns a function that will be executed at most one time, no matter how | ||
// often you call it. Useful for lazy initialization. | ||
_.once = function(func) { | ||
var ran = false, memo; | ||
return function() { | ||
if (ran) return memo; | ||
ran = true; | ||
memo = func.apply(this, arguments); | ||
func = null; | ||
return memo; | ||
}; | ||
}; | ||
// Returns the first function passed as an argument to the second, | ||
@@ -827,12 +861,19 @@ // allowing you to adjust arguments, run code before and after, and | ||
// Returns a negated version of the passed-in predicate. | ||
_.negate = function(predicate) { | ||
return function() { | ||
return !predicate.apply(this, arguments); | ||
}; | ||
}; | ||
// Returns a function that is the composition of a list of functions, each | ||
// consuming the return value of the function that follows. | ||
_.compose = function() { | ||
var funcs = arguments; | ||
var args = arguments; | ||
var start = args.length - 1; | ||
return function() { | ||
var args = arguments; | ||
for (var i = funcs.length - 1; i >= 0; i--) { | ||
args = [funcs[i].apply(this, args)]; | ||
} | ||
return args[0]; | ||
var i = start; | ||
var result = args[start].apply(this, arguments); | ||
while (i--) result = args[i].call(this, result); | ||
return result; | ||
}; | ||
@@ -850,12 +891,44 @@ }; | ||
// Returns a function that will only be executed before being called N times. | ||
_.before = function(times, func) { | ||
var memo; | ||
return function() { | ||
if (--times > 0) { | ||
memo = func.apply(this, arguments); | ||
} | ||
if (times <= 1) { | ||
func = null; | ||
} | ||
return memo; | ||
}; | ||
}; | ||
// Returns a function that will be executed at most one time, no matter how | ||
// often you call it. Useful for lazy initialization. | ||
_.once = _.partial(_.before, 2); | ||
// Object Functions | ||
// ---------------- | ||
// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. | ||
var hasEnumBug = !({toString: null}).propertyIsEnumerable('toString'); | ||
var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', | ||
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; | ||
// Retrieve the names of an object's properties. | ||
// Delegates to **ECMAScript 5**'s native `Object.keys` | ||
_.keys = function(obj) { | ||
if (!_isObject(obj)) return []; | ||
if (!_.isObject(obj) && !_.isArray(obj) && !_.isFunction(obj)) return []; | ||
if (nativeKeys) return nativeKeys(obj); | ||
var keys = []; | ||
for (var key in obj) if (_.has(obj, key)) keys.push(key); | ||
// Ahem, IE < 9. | ||
if (hasEnumBug) { | ||
var nonEnumIdx = nonEnumerableProps.length; | ||
while (nonEnumIdx--) { | ||
var prop = nonEnumerableProps[nonEnumIdx]; | ||
if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); | ||
} | ||
} | ||
return keys; | ||
@@ -868,3 +941,3 @@ }; | ||
var length = keys.length; | ||
var values = new Array(length); | ||
var values = Array(length); | ||
for (var i = 0; i < length; i++) { | ||
@@ -880,3 +953,3 @@ values[i] = obj[keys[i]]; | ||
var length = keys.length; | ||
var pairs = new Array(length); | ||
var pairs = Array(length); | ||
for (var i = 0; i < length; i++) { | ||
@@ -910,9 +983,10 @@ pairs[i] = [keys[i], obj[keys[i]]]; | ||
_.extend = function(obj) { | ||
each(slice.call(arguments, 1), function(source) { | ||
if (source) { | ||
for (var prop in source) { | ||
obj[prop] = source[prop]; | ||
} | ||
if (!_.isObject(obj)) return obj; | ||
var source, prop; | ||
for (var i = 1, length = arguments.length; i < length; i++) { | ||
source = arguments[i]; | ||
for (prop in source) { | ||
obj[prop] = source[prop]; | ||
} | ||
}); | ||
} | ||
return obj; | ||
@@ -922,19 +996,33 @@ }; | ||
// Return a copy of the object only containing the whitelisted properties. | ||
_.pick = function(obj) { | ||
var copy = {}; | ||
var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); | ||
each(keys, function(key) { | ||
if (key in obj) copy[key] = obj[key]; | ||
}); | ||
return copy; | ||
_.pick = function(obj, iteratee, context) { | ||
var result = {}, key; | ||
if (obj == null) return result; | ||
if (_.isFunction(iteratee)) { | ||
iteratee = optimizeCb(iteratee, context); | ||
for (key in obj) { | ||
var value = obj[key]; | ||
if (iteratee(value, key, obj)) result[key] = value; | ||
} | ||
} else { | ||
var keys = flatten(arguments, false, false, 1); | ||
obj = new Object(obj); | ||
for (var i = 0, length = keys.length; i < length; i++) { | ||
key = keys[i]; | ||
if (key in obj) result[key] = obj[key]; | ||
} | ||
} | ||
return result; | ||
}; | ||
// Return a copy of the object without the blacklisted properties. | ||
_.omit = function(obj) { | ||
var copy = {}; | ||
var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); | ||
for (var key in obj) { | ||
if (!_.contains(keys, key)) copy[key] = obj[key]; | ||
_.omit = function(obj, iteratee, context) { | ||
if (_.isFunction(iteratee)) { | ||
iteratee = _.negate(iteratee); | ||
} else { | ||
var keys = _.map(flatten(arguments, false, false, 1), String); | ||
iteratee = function(value, key) { | ||
return !_.contains(keys, key); | ||
}; | ||
} | ||
return copy; | ||
return _.pick(obj, iteratee, context); | ||
}; | ||
@@ -944,9 +1032,9 @@ | ||
_.defaults = function(obj) { | ||
each(slice.call(arguments, 1), function(source) { | ||
if (source) { | ||
for (var prop in source) { | ||
if (obj[prop] === void 0) obj[prop] = source[prop]; | ||
} | ||
if (!_.isObject(obj)) return obj; | ||
for (var i = 1, length = arguments.length; i < length; i++) { | ||
var source = arguments[i]; | ||
for (var prop in source) { | ||
if (obj[prop] === void 0) obj[prop] = source[prop]; | ||
} | ||
}); | ||
} | ||
return obj; | ||
@@ -957,3 +1045,3 @@ }; | ||
_.clone = function(obj) { | ||
if (!_isObject(obj)) return obj; | ||
if (!_.isObject(obj)) return obj; | ||
return _.isArray(obj) ? obj.slice() : _.extend({}, obj); | ||
@@ -974,3 +1062,3 @@ }; | ||
// See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). | ||
if (a === b) return a !== 0 || 1 / a == 1 / b; | ||
if (a === b) return a !== 0 || 1 / a === 1 / b; | ||
// A strict comparison is necessary because `null == undefined`. | ||
@@ -983,13 +1071,17 @@ if (a == null || b == null) return a === b; | ||
var className = toString.call(a); | ||
if (className != toString.call(b)) return false; | ||
if (className !== toString.call(b)) return false; | ||
switch (className) { | ||
// Strings, numbers, dates, and booleans are compared by value. | ||
// Strings, numbers, regular expressions, dates, and booleans are compared by value. | ||
case '[object RegExp]': | ||
// RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') | ||
case '[object String]': | ||
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is | ||
// equivalent to `new String("5")`. | ||
return a == String(b); | ||
return '' + a === '' + b; | ||
case '[object Number]': | ||
// `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for | ||
// other numeric values. | ||
return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); | ||
// `NaN`s are equivalent, but non-reflexive. | ||
// Object(NaN) is equivalent to NaN | ||
if (+a !== +a) return +b !== +b; | ||
// An `egal` comparison is performed for other numeric values. | ||
return +a === 0 ? 1 / +a === 1 / b : +a === +b; | ||
case '[object Date]': | ||
@@ -1000,11 +1092,18 @@ case '[object Boolean]': | ||
// of `NaN` are not equivalent. | ||
return +a == +b; | ||
// RegExps are compared by their source patterns and flags. | ||
case '[object RegExp]': | ||
return a.source == b.source && | ||
a.global == b.global && | ||
a.multiline == b.multiline && | ||
a.ignoreCase == b.ignoreCase; | ||
return +a === +b; | ||
} | ||
if (typeof a != 'object' || typeof b != 'object') return false; | ||
var areArrays = className === '[object Array]'; | ||
if (!areArrays) { | ||
if (typeof a != 'object' || typeof b != 'object') return false; | ||
// Objects with different constructors are not equivalent, but `Object`s or `Array`s | ||
// from different frames are. | ||
var aCtor = a.constructor, bCtor = b.constructor; | ||
if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && | ||
_.isFunction(bCtor) && bCtor instanceof bCtor) | ||
&& ('constructor' in a && 'constructor' in b)) { | ||
return false; | ||
} | ||
} | ||
// Assume equality for cyclic structures. The algorithm for detecting cyclic | ||
@@ -1016,21 +1115,14 @@ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. | ||
// unique nested structures. | ||
if (aStack[length] == a) return bStack[length] == b; | ||
if (aStack[length] === a) return bStack[length] === b; | ||
} | ||
// Objects with different constructors are not equivalent, but `Object`s | ||
// from different frames are. | ||
var aCtor = a.constructor, bCtor = b.constructor; | ||
if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && | ||
_.isFunction(bCtor) && (bCtor instanceof bCtor)) | ||
&& ('constructor' in a && 'constructor' in b)) { | ||
return false; | ||
} | ||
// Add the first object to the stack of traversed objects. | ||
aStack.push(a); | ||
bStack.push(b); | ||
var size = 0, result = true; | ||
var size, result; | ||
// Recursively compare objects and arrays. | ||
if (className == '[object Array]') { | ||
if (areArrays) { | ||
// Compare array lengths to determine if a deep comparison is necessary. | ||
size = a.length; | ||
result = size == b.length; | ||
result = size === b.length; | ||
if (result) { | ||
@@ -1044,17 +1136,13 @@ // Deep compare the contents, ignoring non-numeric properties. | ||
// Deep compare objects. | ||
for (var key in a) { | ||
if (_.has(a, key)) { | ||
// Count the expected number of properties. | ||
size++; | ||
// Deep compare each member. | ||
var keys = _.keys(a), key; | ||
size = keys.length; | ||
// Ensure that both objects contain the same number of properties before comparing deep equality. | ||
result = _.keys(b).length === size; | ||
if (result) { | ||
while (size--) { | ||
// Deep compare each member | ||
key = keys[size]; | ||
if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; | ||
} | ||
} | ||
// Ensure that both objects contain the same number of properties. | ||
if (result) { | ||
for (key in b) { | ||
if (_.has(b, key) && !(size--)) break; | ||
} | ||
result = !size; | ||
} | ||
} | ||
@@ -1076,3 +1164,3 @@ // Remove the first object from the stack of traversed objects. | ||
if (obj == null) return true; | ||
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; | ||
if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0; | ||
for (var key in obj) if (_.has(obj, key)) return false; | ||
@@ -1090,29 +1178,34 @@ return true; | ||
_.isArray = nativeIsArray || function(obj) { | ||
return toString.call(obj) == '[object Array]'; | ||
return toString.call(obj) === '[object Array]'; | ||
}; | ||
// Is a given variable an object? | ||
var _isObject = function(obj) { | ||
return obj === Object(obj); | ||
_.isObject = function(obj) { | ||
var type = typeof obj; | ||
return type === 'function' || type === 'object' && !!obj; | ||
}; | ||
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. | ||
each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { | ||
_.isFunction = function(obj){ | ||
return toString.call(obj) === '[object Function]'; | ||
}; | ||
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. | ||
_.each(['Arguments', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { | ||
_['is' + name] = function(obj) { | ||
return toString.call(obj) == '[object ' + name + ']'; | ||
return toString.call(obj) === '[object ' + name + ']'; | ||
}; | ||
}); | ||
// Define a fallback version of the method in browsers (ahem, IE), where | ||
// Define a fallback version of the method in browsers (ahem, IE < 9), where | ||
// there isn't any inspectable "Arguments" type. | ||
if (!_.isArguments(arguments)) { | ||
_.isArguments = function(obj) { | ||
return !!(obj && _.has(obj, 'callee')); | ||
return _.has(obj, 'callee'); | ||
}; | ||
} | ||
// Optimize `isFunction` if appropriate. | ||
if (typeof (/./) !== 'function') { | ||
// Optimize `isFunction` if appropriate. Work around an IE 11 bug. | ||
if (typeof /./ !== 'function') { | ||
_.isFunction = function(obj) { | ||
return typeof obj === 'function'; | ||
return typeof obj == 'function' || false; | ||
}; | ||
@@ -1128,3 +1221,3 @@ } | ||
_.isNaN = function(obj) { | ||
return _.isNumber(obj) && obj != +obj; | ||
return _.isNumber(obj) && obj !== +obj; | ||
}; | ||
@@ -1134,3 +1227,3 @@ | ||
_.isBoolean = function(obj) { | ||
return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; | ||
return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; | ||
}; | ||
@@ -1151,3 +1244,3 @@ | ||
_.has = function(obj, key) { | ||
return hasOwnProperty.call(obj, key); | ||
return obj != null && hasOwnProperty.call(obj, key); | ||
}; | ||
@@ -1165,3 +1258,3 @@ | ||
// Keep the identity function around for default iterators. | ||
// Keep the identity function around for default iteratees. | ||
_.identity = function(value) { | ||
@@ -1171,4 +1264,5 @@ return value; | ||
// Predicate-generating functions. Often useful outside of Underscore. | ||
_.constant = function(value) { | ||
return function () { | ||
return function() { | ||
return value; | ||
@@ -1178,5 +1272,7 @@ }; | ||
_.noop = function(){}; | ||
_.property = function(key) { | ||
return function(obj) { | ||
return obj[key]; | ||
return obj == null ? void 0 : obj[key]; | ||
}; | ||
@@ -1187,16 +1283,19 @@ }; | ||
_.matches = function(attrs) { | ||
var pairs = _.pairs(attrs), length = pairs.length; | ||
return function(obj) { | ||
if (obj === attrs) return true; | ||
for (var key in attrs) { | ||
if (attrs[key] !== obj[key]) | ||
return false; | ||
if (obj == null) return !length; | ||
obj = new Object(obj); | ||
for (var i = 0; i < length; i++) { | ||
var pair = pairs[i], key = pair[0]; | ||
if (pair[1] !== obj[key] || !(key in obj)) return false; | ||
} | ||
return true; | ||
} | ||
}; | ||
}; | ||
// Run a function **n** times. | ||
_.times = function(n, iterator, context) { | ||
_.times = function(n, iteratee, context) { | ||
var accum = Array(Math.max(0, n)); | ||
for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); | ||
iteratee = optimizeCb(iteratee, context, 1); | ||
for (var i = 0; i < n; i++) accum[i] = iteratee(i); | ||
return accum; | ||
@@ -1215,52 +1314,44 @@ }; | ||
// A (possibly faster) way to get the current timestamp as an integer. | ||
_.now = Date.now || function() { return new Date().getTime(); }; | ||
// List of HTML entities for escaping. | ||
var entityMap = { | ||
escape: { | ||
'&': '&', | ||
'<': '<', | ||
'>': '>', | ||
'"': '"', | ||
"'": ''' | ||
} | ||
_.now = Date.now || function() { | ||
return new Date().getTime(); | ||
}; | ||
entityMap.unescape = _.invert(entityMap.escape); | ||
// Regexes containing the keys and values listed immediately above. | ||
var entityRegexes = { | ||
escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), | ||
unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') | ||
// List of HTML entities for escaping. | ||
var escapeMap = { | ||
'&': '&', | ||
'<': '<', | ||
'>': '>', | ||
'"': '"', | ||
"'": ''', | ||
'`': '`' | ||
}; | ||
var unescapeMap = _.invert(escapeMap); | ||
// Functions for escaping and unescaping strings to/from HTML interpolation. | ||
_.each(['escape', 'unescape'], function(method) { | ||
_[method] = function(string) { | ||
if (string == null) return ''; | ||
return ('' + string).replace(entityRegexes[method], function(match) { | ||
return entityMap[method][match]; | ||
}); | ||
var createEscaper = function(map) { | ||
var escaper = function(match) { | ||
return map[match]; | ||
}; | ||
}); | ||
// Regexes for identifying a key that needs to be escaped | ||
var source = '(?:' + _.keys(map).join('|') + ')'; | ||
var testRegexp = RegExp(source); | ||
var replaceRegexp = RegExp(source, 'g'); | ||
return function(string) { | ||
string = string == null ? '' : '' + string; | ||
return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; | ||
}; | ||
}; | ||
_.escape = createEscaper(escapeMap); | ||
_.unescape = createEscaper(unescapeMap); | ||
// If the value of the named `property` is a function then invoke it with the | ||
// `object` as context; otherwise, return it. | ||
_.result = function(object, property) { | ||
if (object == null) return void 0; | ||
var value = object[property]; | ||
_.result = function(object, property, fallback) { | ||
var value = object == null ? void 0 : object[property]; | ||
if (value === void 0) { | ||
value = fallback; | ||
} | ||
return _.isFunction(value) ? value.call(object) : value; | ||
}; | ||
// Add your own custom functions to the Underscore object. | ||
_.mixin = function(obj) { | ||
each(_.functions(obj), function(name) { | ||
var func = _[name] = obj[name]; | ||
_.prototype[name] = function() { | ||
var args = [this._wrapped]; | ||
push.apply(args, arguments); | ||
return result.call(this, func.apply(_, args)); | ||
}; | ||
}); | ||
}; | ||
// Generate a unique integer id (unique within the entire client session). | ||
@@ -1294,3 +1385,2 @@ // Useful for temporary DOM ids. | ||
'\n': 'n', | ||
'\t': 't', | ||
'\u2028': 'u2028', | ||
@@ -1300,13 +1390,18 @@ '\u2029': 'u2029' | ||
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; | ||
var escaper = /\\|'|\r|\n|\u2028|\u2029/g; | ||
var escapeChar = function(match) { | ||
return '\\' + escapes[match]; | ||
}; | ||
// JavaScript micro-templating, similar to John Resig's implementation. | ||
// Underscore templating handles arbitrary delimiters, preserves whitespace, | ||
// and correctly escapes quotes within interpolated code. | ||
_.template = function(text, data, settings) { | ||
var render; | ||
// NB: `oldSettings` only exists for backwards compatibility. | ||
_.template = function(text, settings, oldSettings) { | ||
if (!settings && oldSettings) settings = oldSettings; | ||
settings = _.defaults({}, settings, _.templateSettings); | ||
// Combine delimiters into one regular expression via alternation. | ||
var matcher = new RegExp([ | ||
var matcher = RegExp([ | ||
(settings.escape || noMatch).source, | ||
@@ -1321,15 +1416,14 @@ (settings.interpolate || noMatch).source, | ||
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { | ||
source += text.slice(index, offset) | ||
.replace(escaper, function(match) { return '\\' + escapes[match]; }); | ||
source += text.slice(index, offset).replace(escaper, escapeChar); | ||
index = offset + match.length; | ||
if (escape) { | ||
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; | ||
} | ||
if (interpolate) { | ||
} else if (interpolate) { | ||
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; | ||
} | ||
if (evaluate) { | ||
} else if (evaluate) { | ||
source += "';\n" + evaluate + "\n__p+='"; | ||
} | ||
index = offset + match.length; | ||
// Adobe VMs need the match returned to produce the correct offest. | ||
return match; | ||
@@ -1344,6 +1438,6 @@ }); | ||
"print=function(){__p+=__j.call(arguments,'');};\n" + | ||
source + "return __p;\n"; | ||
source + 'return __p;\n'; | ||
try { | ||
render = new Function(settings.variable || 'obj', '_', source); | ||
var render = new Function(settings.variable || 'obj', '_', source); | ||
} catch (e) { | ||
@@ -1354,3 +1448,2 @@ e.source = source; | ||
if (data) return render(data, _); | ||
var template = function(data) { | ||
@@ -1360,4 +1453,5 @@ return render.call(this, data, _); | ||
// Provide the compiled function source as a convenience for precompilation. | ||
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; | ||
// Provide the compiled source as a convenience for precompilation. | ||
var argument = settings.variable || 'obj'; | ||
template.source = 'function(' + argument + '){\n' + source + '}'; | ||
@@ -1367,5 +1461,7 @@ return template; | ||
// Add a "chain" function, which will delegate to the wrapper. | ||
// Add a "chain" function. Start chaining a wrapped Underscore object. | ||
_.chain = function(obj) { | ||
return _(obj).chain(); | ||
var instance = _(obj); | ||
instance._chain = true; | ||
return instance; | ||
}; | ||
@@ -1380,6 +1476,18 @@ | ||
// Helper function to continue chaining intermediate results. | ||
var result = function(obj) { | ||
return this._chain ? _(obj).chain() : obj; | ||
var result = function(instance, obj) { | ||
return instance._chain ? _(obj).chain() : obj; | ||
}; | ||
// Add your own custom functions to the Underscore object. | ||
_.mixin = function(obj) { | ||
_.each(_.functions(obj), function(name) { | ||
var func = _[name] = obj[name]; | ||
_.prototype[name] = function() { | ||
var args = [this._wrapped]; | ||
push.apply(args, arguments); | ||
return result(this, func.apply(_, args)); | ||
}; | ||
}); | ||
}; | ||
// Add all of the Underscore functions to the wrapper object. | ||
@@ -1389,3 +1497,3 @@ _.mixin(_); | ||
// Add all mutator Array functions to the wrapper. | ||
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { | ||
_.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { | ||
var method = ArrayProto[name]; | ||
@@ -1395,4 +1503,4 @@ _.prototype[name] = function() { | ||
method.apply(obj, arguments); | ||
if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; | ||
return result.call(this, obj); | ||
if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; | ||
return result(this, obj); | ||
}; | ||
@@ -1402,24 +1510,14 @@ }); | ||
// Add all accessor Array functions to the wrapper. | ||
each(['concat', 'join', 'slice'], function(name) { | ||
_.each(['concat', 'join', 'slice'], function(name) { | ||
var method = ArrayProto[name]; | ||
_.prototype[name] = function() { | ||
return result.call(this, method.apply(this._wrapped, arguments)); | ||
return result(this, method.apply(this._wrapped, arguments)); | ||
}; | ||
}); | ||
_.extend(_.prototype, { | ||
// Extracts the result from a wrapped and chained object. | ||
_.prototype.value = function() { | ||
return this._wrapped; | ||
}; | ||
// Start chaining a wrapped Underscore object. | ||
chain: function() { | ||
this._chain = true; | ||
return this; | ||
}, | ||
// Extracts the result from a wrapped and chained object. | ||
value: function() { | ||
return this._wrapped; | ||
} | ||
}); | ||
// AMD registration happens at the end for compatibility with AMD loaders | ||
@@ -1437,2 +1535,2 @@ // that may not enforce next-turn semantics on modules. Even though general | ||
} | ||
}).call(this); | ||
}.call(this)); |
@@ -9,6 +9,3 @@ | ||
for(var p in _){ | ||
exports[p] = _[p]; | ||
} | ||
module.exports = _; | ||
{ | ||
"name": "dry-underscore", | ||
"version": "0.7.1", | ||
"version": "0.8.1", | ||
"dependencies": { | ||
@@ -5,0 +5,0 @@ "formidable": { |
{ | ||
"name": "dry-underscore", | ||
"version": "0.7.1", | ||
"version": "0.8.1", | ||
"main": "./lib/index.js", | ||
@@ -5,0 +5,0 @@ "description": "The DRY Undescore Library", |
@@ -33,2 +33,4 @@ "use strict"; | ||
exports.testPropertyComparerMaker = testPropertyComparerMaker; | ||
exports.testPartial = testPartial; | ||
exports.testEach = testEach; | ||
//exports.hashTest = hashTest; | ||
@@ -45,2 +47,29 @@ //exports.testFatal = testFatal; | ||
function testEach(){ | ||
function f(){} | ||
f.prop = true; | ||
var seen = false; | ||
_.each(f, function(val, key){ | ||
if(key === "prop" && val === true){ | ||
seen = true; | ||
} | ||
}); | ||
ok(seen); | ||
} | ||
function testPartial(){ | ||
function a(){ return(arguments); } | ||
var f = _.partial(a, 1, _, 3); | ||
eq(_.a(f(2)),[1, 2, 3]); | ||
} | ||
function testBail(beforeExit){ | ||
@@ -47,0 +76,0 @@ var bailCalls = 0; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1576958
88
14243