Files
coffeescript/documentation/docs/underscore.html
Phillip Alexander ce14ad764a Fix formatting issues in underscore.coffee documentation (generated html)
Use docco to regenerate documentation for underscore.coffee.
2013-08-20 09:57:52 -07:00

1893 lines
76 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>underscore.coffee</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>underscore.coffee</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">&#182;</a>
</div>
<p><strong>Underscore.coffee
(c) 2011 Jeremy Ashkenas, DocumentCloud Inc.</strong>
Underscore is freely distributable under the terms of the
<a href="http://en.wikipedia.org/wiki/MIT_License">MIT license</a>.
Portions of Underscore are inspired by or borrowed from
<a href="http://prototypejs.org/api">Prototype.js</a>, Oliver Steele&#39;s
<a href="http://osteele.com">Functional</a>, and John Resig&#39;s
<a href="http://ejohn.org">Micro-Templating</a>.
For all details and documentation:
<a href="http://documentcloud.github.com/underscore/">http://documentcloud.github.com/underscore/</a></p>
<h2>Baseline setup</h2>
</div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">&#182;</a>
</div>
<p>Establish the root object, <code>window</code> in the browser, or <code>global</code> on the server.</p>
</div>
<div class="content"><div class='highlight'><pre>root = <span class="keyword">this</span></pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">&#182;</a>
</div>
<p>Save the previous value of the <code>_</code> variable.</p>
</div>
<div class="content"><div class='highlight'><pre>previousUnderscore = root._</pre></div></div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">&#182;</a>
</div>
<p>Establish the object that gets thrown to break out of a loop iteration.
<code>StopIteration</code> is SOP on Mozilla.</p>
</div>
<div class="content"><div class='highlight'><pre>breaker = <span class="keyword">if</span> <span class="keyword">typeof</span>(StopIteration) <span class="keyword">is</span> <span class="string">'undefined'</span> <span class="keyword">then</span> <span class="string">'__break__'</span> <span class="keyword">else</span> StopIteration</pre></div></div>
</li>
<li id="section-5">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-5">&#182;</a>
</div>
<p>Helper function to escape <strong>RegExp</strong> contents, because JS doesn&#39;t have one.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="function"><span class="title">escapeRegExp</span></span> = (string) -&gt; string.replace(<span class="regexp">/([.*+?^${}()|[\]\/\\])/g</span>, <span class="string">'\\$1'</span>)</pre></div></div>
</li>
<li id="section-6">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-6">&#182;</a>
</div>
<p>Save bytes in the minified (but not gzipped) version:</p>
</div>
<div class="content"><div class='highlight'><pre>ArrayProto = Array.prototype
ObjProto = Object.prototype</pre></div></div>
</li>
<li id="section-7">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-7">&#182;</a>
</div>
<p>Create quick reference variables for speed access to core prototypes.</p>
</div>
<div class="content"><div class='highlight'><pre>slice = ArrayProto.slice
unshift = ArrayProto.unshift
toString = ObjProto.toString
hasOwnProperty = ObjProto.hasOwnProperty
propertyIsEnumerable = ObjProto.propertyIsEnumerable</pre></div></div>
</li>
<li id="section-8">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-8">&#182;</a>
</div>
<p>All <strong>ECMA5</strong> native implementations we hope to use are declared here.</p>
</div>
<div class="content"><div class='highlight'><pre>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
nativeKeys = Object.keys</pre></div></div>
</li>
<li id="section-9">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-9">&#182;</a>
</div>
<p>Create a safe reference to the Underscore object for use below.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="function"><span class="title">_</span></span> = (obj) -&gt; <span class="keyword">new</span> wrapper(obj)</pre></div></div>
</li>
<li id="section-10">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-10">&#182;</a>
</div>
<p>Export the Underscore object for <strong>CommonJS</strong>.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="keyword">if</span> <span class="keyword">typeof</span>(exports) != <span class="string">'undefined'</span> <span class="keyword">then</span> exports._ = _</pre></div></div>
</li>
<li id="section-11">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-11">&#182;</a>
</div>
<p>Export Underscore to global scope.</p>
</div>
<div class="content"><div class='highlight'><pre>root._ = _</pre></div></div>
</li>
<li id="section-12">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-12">&#182;</a>
</div>
<p>Current version.</p>
</div>
<div class="content"><div class='highlight'><pre>_.VERSION = <span class="string">'1.1.0'</span></pre></div></div>
</li>
<li id="section-13">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-13">&#182;</a>
</div>
<h2>Collection Functions</h2>
</div>
</li>
<li id="section-14">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-14">&#182;</a>
</div>
<p>The cornerstone, an <strong>each</strong> implementation.
Handles objects implementing <strong>forEach</strong>, arrays, and raw objects.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">each</span></span> = (obj, iterator, context) -&gt;
<span class="keyword">try</span>
<span class="keyword">if</span> nativeForEach <span class="keyword">and</span> obj.forEach <span class="keyword">is</span> nativeForEach
obj.forEach iterator, context
<span class="keyword">else</span> <span class="keyword">if</span> _.isNumber obj.length
iterator.call context, obj[i], i, obj <span class="keyword">for</span> i <span class="keyword">in</span> [<span class="number">0.</span>..obj.length]
<span class="keyword">else</span>
iterator.call context, val, key, obj <span class="keyword">for</span> own key, val <span class="keyword">of</span> obj
<span class="keyword">catch</span> e
<span class="keyword">throw</span> e <span class="keyword">if</span> e <span class="keyword">isnt</span> breaker
obj</pre></div></div>
</li>
<li id="section-15">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-15">&#182;</a>
</div>
<p>Return the results of applying the iterator to each element. Use JavaScript
1.6&#39;s version of <strong>map</strong>, if possible.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">map</span></span> = (obj, iterator, context) -&gt;
<span class="keyword">return</span> obj.map(iterator, context) <span class="keyword">if</span> nativeMap <span class="keyword">and</span> obj.map <span class="keyword">is</span> nativeMap
results = []
_.each obj, (value, index, list) -&gt;
results.push iterator.call context, value, index, list
results</pre></div></div>
</li>
<li id="section-16">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-16">&#182;</a>
</div>
<p><strong>Reduce</strong> builds up a single result from a list of values. Also known as
<strong>inject</strong>, or <strong>foldl</strong>. Uses JavaScript 1.8&#39;s version of <strong>reduce</strong>, if possible.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">reduce</span></span> = (obj, iterator, memo, context) -&gt;
<span class="keyword">if</span> nativeReduce <span class="keyword">and</span> obj.reduce <span class="keyword">is</span> nativeReduce
iterator = _.bind iterator, context <span class="keyword">if</span> context
<span class="keyword">return</span> obj.reduce iterator, memo
_.each obj, (value, index, list) -&gt;
memo = iterator.call context, memo, value, index, list
memo</pre></div></div>
</li>
<li id="section-17">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-17">&#182;</a>
</div>
<p>The right-associative version of <strong>reduce</strong>, also known as <strong>foldr</strong>. Uses
JavaScript 1.8&#39;s version of <strong>reduceRight</strong>, if available.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">reduceRight</span></span> = (obj, iterator, memo, context) -&gt;
<span class="keyword">if</span> nativeReduceRight <span class="keyword">and</span> obj.reduceRight <span class="keyword">is</span> nativeReduceRight
iterator = _.bind iterator, context <span class="keyword">if</span> context
<span class="keyword">return</span> obj.reduceRight iterator, memo
reversed = _.clone(_.toArray(obj)).reverse()
_.reduce reversed, iterator, memo, context</pre></div></div>
</li>
<li id="section-18">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-18">&#182;</a>
</div>
<p>Return the first value which passes a truth test.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">detect</span></span> = (obj, iterator, context) -&gt;
result = <span class="literal">null</span>
_.each obj, (value, index, list) -&gt;
<span class="keyword">if</span> iterator.call context, value, index, list
result = value
_.breakLoop()
result</pre></div></div>
</li>
<li id="section-19">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-19">&#182;</a>
</div>
<p>Return all the elements that pass a truth test. Use JavaScript 1.6&#39;s
<strong>filter</strong>, if it exists.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">filter</span></span> = (obj, iterator, context) -&gt;
<span class="keyword">return</span> obj.filter iterator, context <span class="keyword">if</span> nativeFilter <span class="keyword">and</span> obj.filter <span class="keyword">is</span> nativeFilter
results = []
_.each obj, (value, index, list) -&gt;
results.push value <span class="keyword">if</span> iterator.call context, value, index, list
results</pre></div></div>
</li>
<li id="section-20">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-20">&#182;</a>
</div>
<p>Return all the elements for which a truth test fails.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">reject</span></span> = (obj, iterator, context) -&gt;
results = []
_.each obj, (value, index, list) -&gt;
results.push value <span class="keyword">if</span> <span class="keyword">not</span> iterator.call context, value, index, list
results</pre></div></div>
</li>
<li id="section-21">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-21">&#182;</a>
</div>
<p>Determine whether all of the elements match a truth test. Delegate to
JavaScript 1.6&#39;s <strong>every</strong>, if it is present.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">every</span></span> = (obj, iterator, context) -&gt;
iterator ||= _.identity
<span class="keyword">return</span> obj.every iterator, context <span class="keyword">if</span> nativeEvery <span class="keyword">and</span> obj.every <span class="keyword">is</span> nativeEvery
result = <span class="literal">true</span>
_.each obj, (value, index, list) -&gt;
_.breakLoop() <span class="keyword">unless</span> (result = result <span class="keyword">and</span> iterator.call(context, value, index, list))
result</pre></div></div>
</li>
<li id="section-22">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-22">&#182;</a>
</div>
<p>Determine if at least one element in the object matches a truth test. Use
JavaScript 1.6&#39;s <strong>some</strong>, if it exists.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">some</span></span> = (obj, iterator, context) -&gt;
iterator ||= _.identity
<span class="keyword">return</span> obj.some iterator, context <span class="keyword">if</span> nativeSome <span class="keyword">and</span> obj.some <span class="keyword">is</span> nativeSome
result = <span class="literal">false</span>
_.each obj, (value, index, list) -&gt;
_.breakLoop() <span class="keyword">if</span> (result = iterator.call(context, value, index, list))
result</pre></div></div>
</li>
<li id="section-23">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-23">&#182;</a>
</div>
<p>Determine if a given value is included in the array or object,
based on <code>===</code>.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">include</span></span> = (obj, target) -&gt;
<span class="keyword">return</span> _.indexOf(obj, target) <span class="keyword">isnt</span> -<span class="number">1</span> <span class="keyword">if</span> nativeIndexOf <span class="keyword">and</span> obj.indexOf <span class="keyword">is</span> nativeIndexOf
<span class="keyword">return</span> <span class="literal">true</span> <span class="keyword">for</span> own key, val <span class="keyword">of</span> obj <span class="keyword">when</span> val <span class="keyword">is</span> target
<span class="literal">false</span></pre></div></div>
</li>
<li id="section-24">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-24">&#182;</a>
</div>
<p>Invoke a method with arguments on every item in a collection.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">invoke</span></span> = (obj, method) -&gt;
args = _.rest arguments, <span class="number">2</span>
(<span class="keyword">if</span> method <span class="keyword">then</span> val[method] <span class="keyword">else</span> val).apply(val, args) <span class="keyword">for</span> val <span class="keyword">in</span> obj</pre></div></div>
</li>
<li id="section-25">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-25">&#182;</a>
</div>
<p>Convenience version of a common use case of <strong>map</strong>: fetching a property.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">pluck</span></span> = (obj, key) -&gt;
_.map(obj, (val) -&gt; val[key])</pre></div></div>
</li>
<li id="section-26">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-26">&#182;</a>
</div>
<p>Return the maximum item or (item-based computation).</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">max</span></span> = (obj, iterator, context) -&gt;
<span class="keyword">return</span> Math.max.apply(Math, obj) <span class="keyword">if</span> <span class="keyword">not</span> iterator <span class="keyword">and</span> _.isArray(obj)
result = computed: -Infinity
_.each obj, (value, index, list) -&gt;
computed = <span class="keyword">if</span> iterator <span class="keyword">then</span> iterator.call(context, value, index, list) <span class="keyword">else</span> value
computed &gt;= result.computed <span class="keyword">and</span> (result = {value: value, computed: computed})
result.value</pre></div></div>
</li>
<li id="section-27">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-27">&#182;</a>
</div>
<p>Return the minimum element (or element-based computation).</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">min</span></span> = (obj, iterator, context) -&gt;
<span class="keyword">return</span> Math.min.apply(Math, obj) <span class="keyword">if</span> <span class="keyword">not</span> iterator <span class="keyword">and</span> _.isArray(obj)
result = computed: Infinity
_.each obj, (value, index, list) -&gt;
computed = <span class="keyword">if</span> iterator <span class="keyword">then</span> iterator.call(context, value, index, list) <span class="keyword">else</span> value
computed &lt; result.computed <span class="keyword">and</span> (result = {value: value, computed: computed})
result.value</pre></div></div>
</li>
<li id="section-28">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-28">&#182;</a>
</div>
<p>Sort the object&#39;s values by a criterion produced by an iterator.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">sortBy</span></span> = (obj, iterator, context) -&gt;
_.pluck(((_.map obj, (value, index, list) -&gt;
{value: value, criteria: iterator.call(context, value, index, list)}
).sort((left, right) -&gt;
a = left.criteria; b = right.criteria
<span class="keyword">if</span> a &lt; b <span class="keyword">then</span> -<span class="number">1</span> <span class="keyword">else</span> <span class="keyword">if</span> a &gt; b <span class="keyword">then</span> <span class="number">1</span> <span class="keyword">else</span> <span class="number">0</span>
)), <span class="string">'value'</span>)</pre></div></div>
</li>
<li id="section-29">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-29">&#182;</a>
</div>
<p>Use a comparator function to figure out at what index an object should
be inserted so as to maintain order. Uses binary search.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">sortedIndex</span></span> = (array, obj, iterator) -&gt;
iterator ||= _.identity
low = <span class="number">0</span>
high = array.length
<span class="keyword">while</span> low &lt; high
mid = (low + high) &gt;&gt; <span class="number">1</span>
<span class="keyword">if</span> iterator(array[mid]) &lt; iterator(obj) <span class="keyword">then</span> low = mid + <span class="number">1</span> <span class="keyword">else</span> high = mid
low</pre></div></div>
</li>
<li id="section-30">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-30">&#182;</a>
</div>
<p>Convert anything iterable into a real, live array.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">toArray</span></span> = (iterable) -&gt;
<span class="keyword">return</span> [] <span class="keyword">if</span> (!iterable)
<span class="keyword">return</span> iterable.toArray() <span class="keyword">if</span> (iterable.toArray)
<span class="keyword">return</span> iterable <span class="keyword">if</span> (_.isArray(iterable))
<span class="keyword">return</span> slice.call(iterable) <span class="keyword">if</span> (_.isArguments(iterable))
_.values(iterable)</pre></div></div>
</li>
<li id="section-31">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-31">&#182;</a>
</div>
<p>Return the number of elements in an object.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">size</span></span> = (obj) -&gt; _.toArray(obj).length</pre></div></div>
</li>
<li id="section-32">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-32">&#182;</a>
</div>
<h2>Array Functions</h2>
</div>
</li>
<li id="section-33">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-33">&#182;</a>
</div>
<p>Get the first element of an array. Passing <code>n</code> will return the first N
values in the array. Aliased as <strong>head</strong>. The <code>guard</code> check allows it to work
with <strong>map</strong>.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">first</span></span> = (array, n, guard) -&gt;
<span class="keyword">if</span> n <span class="keyword">and</span> <span class="keyword">not</span> guard <span class="keyword">then</span> slice.call(array, <span class="number">0</span>, n) <span class="keyword">else</span> array[<span class="number">0</span>]</pre></div></div>
</li>
<li id="section-34">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-34">&#182;</a>
</div>
<p>Returns everything but the first entry of the array. Aliased as <strong>tail</strong>.
Especially useful on the arguments object. Passing an <code>index</code> will return
the rest of the values in the array from that index onward. The <code>guard</code>
check allows it to work with <strong>map</strong>.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">rest</span></span> = (array, index, guard) -&gt;
slice.call(array, <span class="keyword">if</span> _.isUndefined(index) <span class="keyword">or</span> guard <span class="keyword">then</span> <span class="number">1</span> <span class="keyword">else</span> index)</pre></div></div>
</li>
<li id="section-35">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-35">&#182;</a>
</div>
<p>Get the last element of an array.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">last</span></span> = (array) -&gt; array[array.length - <span class="number">1</span>]</pre></div></div>
</li>
<li id="section-36">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-36">&#182;</a>
</div>
<p>Trim out all falsy values from an array.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">compact</span></span> = (array) -&gt; item <span class="keyword">for</span> item <span class="keyword">in</span> array <span class="keyword">when</span> item</pre></div></div>
</li>
<li id="section-37">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-37">&#182;</a>
</div>
<p>Return a completely flattened version of an array.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">flatten</span></span> = (array) -&gt;
_.reduce array, (memo, value) -&gt;
<span class="keyword">return</span> memo.concat(_.flatten(value)) <span class="keyword">if</span> _.isArray value
memo.push value
memo
, []</pre></div></div>
</li>
<li id="section-38">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-38">&#182;</a>
</div>
<p>Return a version of the array that does not contain the specified value(s).</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">without</span></span> = (array) -&gt;
values = _.rest arguments
val <span class="keyword">for</span> val <span class="keyword">in</span> _.toArray(array) <span class="keyword">when</span> <span class="keyword">not</span> _.include values, val</pre></div></div>
</li>
<li id="section-39">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-39">&#182;</a>
</div>
<p>Produce a duplicate-free version of the array. If the array has already
been sorted, you have the option of using a faster algorithm.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">uniq</span></span> = (array, isSorted) -&gt;
memo = []
<span class="keyword">for</span> el, i <span class="keyword">in</span> _.toArray array
memo.push el <span class="keyword">if</span> i <span class="keyword">is</span> <span class="number">0</span> || (<span class="keyword">if</span> isSorted <span class="keyword">is</span> <span class="literal">true</span> <span class="keyword">then</span> _.last(memo) <span class="keyword">isnt</span> el <span class="keyword">else</span> <span class="keyword">not</span> _.include(memo, el))
memo</pre></div></div>
</li>
<li id="section-40">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-40">&#182;</a>
</div>
<p>Produce an array that contains every item shared between all the
passed-in arrays.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">intersect</span></span> = (array) -&gt;
rest = _.rest arguments
_.select _.uniq(array), (item) -&gt;
_.all rest, (other) -&gt;
_.indexOf(other, item) &gt;= <span class="number">0</span></pre></div></div>
</li>
<li id="section-41">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-41">&#182;</a>
</div>
<p>Zip together multiple lists into a single array -- elements that share
an index go together.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">zip</span></span> = -&gt;
length = _.max _.pluck arguments, <span class="string">'length'</span>
results = <span class="keyword">new</span> Array length
<span class="keyword">for</span> i <span class="keyword">in</span> [<span class="number">0.</span>..length]
results[i] = _.pluck arguments, String i
results</pre></div></div>
</li>
<li id="section-42">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-42">&#182;</a>
</div>
<p>If the browser doesn&#39;t supply us with <strong>indexOf</strong> (I&#39;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.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">indexOf</span></span> = (array, item) -&gt;
<span class="keyword">return</span> array.indexOf item <span class="keyword">if</span> nativeIndexOf <span class="keyword">and</span> array.indexOf <span class="keyword">is</span> nativeIndexOf
i = <span class="number">0</span>; l = array.length
<span class="keyword">while</span> l - i
<span class="keyword">if</span> array[i] <span class="keyword">is</span> item <span class="keyword">then</span> <span class="keyword">return</span> i <span class="keyword">else</span> i++
-<span class="number">1</span></pre></div></div>
</li>
<li id="section-43">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-43">&#182;</a>
</div>
<p>Provide JavaScript 1.6&#39;s <strong>lastIndexOf</strong>, delegating to the native function,
if possible.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">lastIndexOf</span></span> = (array, item) -&gt;
<span class="keyword">return</span> array.lastIndexOf(item) <span class="keyword">if</span> nativeLastIndexOf <span class="keyword">and</span> array.lastIndexOf <span class="keyword">is</span> nativeLastIndexOf
i = array.length
<span class="keyword">while</span> i
<span class="keyword">if</span> array[i] <span class="keyword">is</span> item <span class="keyword">then</span> <span class="keyword">return</span> i <span class="keyword">else</span> i--
-<span class="number">1</span></pre></div></div>
</li>
<li id="section-44">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-44">&#182;</a>
</div>
<p>Generate an integer Array containing an arithmetic progression. A port of
<a href="http://docs.python.org/library/functions.html#range">the native Python <strong>range</strong> function</a>.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">range</span></span> = (start, stop, step) -&gt;
a = arguments
solo = a.length &lt;= <span class="number">1</span>
i = start = <span class="keyword">if</span> solo <span class="keyword">then</span> <span class="number">0</span> <span class="keyword">else</span> a[<span class="number">0</span>]
stop = <span class="keyword">if</span> solo <span class="keyword">then</span> a[<span class="number">0</span>] <span class="keyword">else</span> a[<span class="number">1</span>]
step = a[<span class="number">2</span>] <span class="keyword">or</span> <span class="number">1</span>
len = Math.ceil((stop - start) / step)
<span class="keyword">return</span> [] <span class="keyword">if</span> len &lt;= <span class="number">0</span>
range = <span class="keyword">new</span> Array len
idx = <span class="number">0</span>
<span class="keyword">loop</span>
<span class="keyword">return</span> range <span class="keyword">if</span> (<span class="keyword">if</span> step &gt; <span class="number">0</span> <span class="keyword">then</span> i - stop <span class="keyword">else</span> stop - i) &gt;= <span class="number">0</span>
range[idx] = i
idx++
i+= step</pre></div></div>
</li>
<li id="section-45">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-45">&#182;</a>
</div>
<h2>Function Functions</h2>
</div>
</li>
<li id="section-46">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-46">&#182;</a>
</div>
<p>Create a function bound to a given object (assigning <code>this</code>, and arguments,
optionally). Binding with arguments is also known as <strong>curry</strong>.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">bind</span></span> = (func, obj) -&gt;
args = _.rest arguments, <span class="number">2</span>
-&gt; func.apply obj <span class="keyword">or</span> root, args.concat arguments</pre></div></div>
</li>
<li id="section-47">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-47">&#182;</a>
</div>
<p>Bind all of an object&#39;s methods to that object. Useful for ensuring that
all callbacks defined on an object belong to it.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">bindAll</span></span> = (obj) -&gt;
funcs = <span class="keyword">if</span> arguments.length &gt; <span class="number">1</span> <span class="keyword">then</span> _.rest(arguments) <span class="keyword">else</span> _.functions(obj)
_.each funcs, (f) -&gt; obj[f] = _.bind obj[f], obj
obj</pre></div></div>
</li>
<li id="section-48">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-48">&#182;</a>
</div>
<p>Delays a function for the given number of milliseconds, and then calls
it with the arguments supplied.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">delay</span></span> = (func, wait) -&gt;
args = _.rest arguments, <span class="number">2</span>
setTimeout((-&gt; func.apply(func, args)), wait)</pre></div></div>
</li>
<li id="section-49">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-49">&#182;</a>
</div>
<p>Memoize an expensive function by storing its results.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">memoize</span></span> = (func, hasher) -&gt;
memo = {}
hasher <span class="keyword">or</span>= _.identity
-&gt;
key = hasher.apply <span class="keyword">this</span>, arguments
<span class="keyword">return</span> memo[key] <span class="keyword">if</span> key <span class="keyword">of</span> memo
memo[key] = func.apply <span class="keyword">this</span>, arguments</pre></div></div>
</li>
<li id="section-50">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-50">&#182;</a>
</div>
<p>Defers a function, scheduling it to run after the current call stack has
cleared.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">defer</span></span> = (func) -&gt;
_.delay.apply _, [func, <span class="number">1</span>].concat _.rest arguments</pre></div></div>
</li>
<li id="section-51">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-51">&#182;</a>
</div>
<p>Returns the first function passed as an argument to the second,
allowing you to adjust arguments, run code before and after, and
conditionally execute the original function.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">wrap</span></span> = (func, wrapper) -&gt;
-&gt; wrapper.apply wrapper, [func].concat arguments</pre></div></div>
</li>
<li id="section-52">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-52">&#182;</a>
</div>
<p>Returns a function that is the composition of a list of functions, each
consuming the return value of the function that follows.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">compose</span></span> = -&gt;
funcs = arguments
-&gt;
args = arguments
<span class="keyword">for</span> i <span class="keyword">in</span> [funcs.length - <span class="number">1.</span><span class="number">.0</span>] <span class="keyword">by</span> -<span class="number">1</span>
args = [funcs[i].apply(<span class="keyword">this</span>, args)]
args[<span class="number">0</span>]</pre></div></div>
</li>
<li id="section-53">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-53">&#182;</a>
</div>
<h2>Object Functions</h2>
</div>
</li>
<li id="section-54">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-54">&#182;</a>
</div>
<p>Retrieve the names of an object&#39;s properties.</p>
</div>
<div class="content"><div class='highlight'><pre>_.keys = nativeKeys <span class="keyword">or</span> (obj) -&gt;
<span class="keyword">return</span> _.range <span class="number">0</span>, obj.length <span class="keyword">if</span> _.isArray(obj)
key <span class="keyword">for</span> key, val <span class="keyword">of</span> obj</pre></div></div>
</li>
<li id="section-55">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-55">&#182;</a>
</div>
<p>Retrieve the values of an object&#39;s properties.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">values</span></span> = (obj) -&gt;
_.map obj, _.identity</pre></div></div>
</li>
<li id="section-56">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-56">&#182;</a>
</div>
<p>Return a sorted list of the function names available in Underscore.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">functions</span></span> = (obj) -&gt;
_.filter(_.keys(obj), (key) -&gt; _.isFunction(obj[key])).sort()</pre></div></div>
</li>
<li id="section-57">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-57">&#182;</a>
</div>
<p>Extend a given object with all of the properties in a source object.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">extend</span></span> = (obj) -&gt;
<span class="keyword">for</span> source <span class="keyword">in</span> _.rest(arguments)
obj[key] = val <span class="keyword">for</span> key, val <span class="keyword">of</span> source
obj</pre></div></div>
</li>
<li id="section-58">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-58">&#182;</a>
</div>
<p>Create a (shallow-cloned) duplicate of an object.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">clone</span></span> = (obj) -&gt;
<span class="keyword">return</span> obj.slice <span class="number">0</span> <span class="keyword">if</span> _.isArray obj
_.extend {}, obj</pre></div></div>
</li>
<li id="section-59">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-59">&#182;</a>
</div>
<p>Invokes interceptor with the obj, and then returns obj.
The primary purpose of this method is to &quot;tap into&quot; a method chain, in order to perform operations on intermediate results within the chain.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">tap</span></span> = (obj, interceptor) -&gt;
interceptor obj
obj</pre></div></div>
</li>
<li id="section-60">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-60">&#182;</a>
</div>
<p>Perform a deep comparison to check if two objects are equal.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isEqual</span></span> = (a, b) -&gt;</pre></div></div>
</li>
<li id="section-61">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-61">&#182;</a>
</div>
<p>Check object identity.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">true</span> <span class="keyword">if</span> a <span class="keyword">is</span> b</pre></div></div>
</li>
<li id="section-62">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-62">&#182;</a>
</div>
<p>Different types?</p>
</div>
<div class="content"><div class='highlight'><pre> atype = <span class="keyword">typeof</span>(a); btype = <span class="keyword">typeof</span>(b)
<span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> atype <span class="keyword">isnt</span> btype</pre></div></div>
</li>
<li id="section-63">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-63">&#182;</a>
</div>
<p>Basic equality test (watch out for coercions).</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">true</span> <span class="keyword">if</span> `<span class="javascript">a == b</span>`</pre></div></div>
</li>
<li id="section-64">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-64">&#182;</a>
</div>
<p>One is falsy and the other truthy.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> (!a <span class="keyword">and</span> b) <span class="keyword">or</span> (a <span class="keyword">and</span> !b)</pre></div></div>
</li>
<li id="section-65">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-65">&#182;</a>
</div>
<p>One of them implements an <code>isEqual()</code>?</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> a.isEqual(b) <span class="keyword">if</span> a.isEqual</pre></div></div>
</li>
<li id="section-66">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-66">&#182;</a>
</div>
<p>Check dates&#39; integer values.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> a.getTime() <span class="keyword">is</span> b.getTime() <span class="keyword">if</span> _.isDate(a) <span class="keyword">and</span> _.isDate(b)</pre></div></div>
</li>
<li id="section-67">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-67">&#182;</a>
</div>
<p>Both are NaN?</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> _.isNaN(a) <span class="keyword">and</span> _.isNaN(b)</pre></div></div>
</li>
<li id="section-68">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-68">&#182;</a>
</div>
<p>Compare regular expressions.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> _.isRegExp(a) <span class="keyword">and</span> _.isRegExp(b)
<span class="keyword">return</span> a.source <span class="keyword">is</span> b.source <span class="keyword">and</span>
a.global <span class="keyword">is</span> b.global <span class="keyword">and</span>
a.ignoreCase <span class="keyword">is</span> b.ignoreCase <span class="keyword">and</span>
a.multiline <span class="keyword">is</span> b.multiline</pre></div></div>
</li>
<li id="section-69">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-69">&#182;</a>
</div>
<p>If a is not an object by this point, we can&#39;t handle it.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> atype <span class="keyword">isnt</span> <span class="string">'object'</span></pre></div></div>
</li>
<li id="section-70">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-70">&#182;</a>
</div>
<p>Check for different array lengths before comparing contents.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> a.length <span class="keyword">and</span> (a.length <span class="keyword">isnt</span> b.length)</pre></div></div>
</li>
<li id="section-71">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-71">&#182;</a>
</div>
<p>Nothing else worked, deep compare the contents.</p>
</div>
<div class="content"><div class='highlight'><pre> aKeys = _.keys(a); bKeys = _.keys(b)</pre></div></div>
</li>
<li id="section-72">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-72">&#182;</a>
</div>
<p>Different object sizes?</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> aKeys.length <span class="keyword">isnt</span> bKeys.length</pre></div></div>
</li>
<li id="section-73">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-73">&#182;</a>
</div>
<p>Recursive comparison of contents.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">for</span> key, val <span class="keyword">of</span> a <span class="keyword">when</span> !(key <span class="keyword">of</span> b) <span class="keyword">or</span> !_.isEqual(val, b[key])
<span class="literal">true</span></pre></div></div>
</li>
<li id="section-74">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-74">&#182;</a>
</div>
<p>Is a given array or object empty?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isEmpty</span></span> = (obj) -&gt;
<span class="keyword">return</span> obj.length <span class="keyword">is</span> <span class="number">0</span> <span class="keyword">if</span> _.isArray(obj) <span class="keyword">or</span> _.isString(obj)
<span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">for</span> own key <span class="keyword">of</span> obj
<span class="literal">true</span></pre></div></div>
</li>
<li id="section-75">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-75">&#182;</a>
</div>
<p>Is a given value a DOM element?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isElement</span></span> = (obj) -&gt; obj <span class="keyword">and</span> obj.nodeType <span class="keyword">is</span> <span class="number">1</span></pre></div></div>
</li>
<li id="section-76">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-76">&#182;</a>
</div>
<p>Is a given value an array?</p>
</div>
<div class="content"><div class='highlight'><pre>_.isArray = nativeIsArray <span class="keyword">or</span> (obj) -&gt; !!(obj <span class="keyword">and</span> obj.concat <span class="keyword">and</span> obj.unshift <span class="keyword">and</span> <span class="keyword">not</span> obj.callee)</pre></div></div>
</li>
<li id="section-77">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-77">&#182;</a>
</div>
<p>Is a given variable an arguments object?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isArguments</span></span> = (obj) -&gt; obj <span class="keyword">and</span> obj.callee</pre></div></div>
</li>
<li id="section-78">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-78">&#182;</a>
</div>
<p>Is the given value a function?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isFunction</span></span> = (obj) -&gt; !!(obj <span class="keyword">and</span> obj.constructor <span class="keyword">and</span> obj.call <span class="keyword">and</span> obj.apply)</pre></div></div>
</li>
<li id="section-79">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-79">&#182;</a>
</div>
<p>Is the given value a string?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isString</span></span> = (obj) -&gt; !!(obj <span class="keyword">is</span> <span class="string">''</span> <span class="keyword">or</span> (obj <span class="keyword">and</span> obj.charCodeAt <span class="keyword">and</span> obj.substr))</pre></div></div>
</li>
<li id="section-80">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-80">&#182;</a>
</div>
<p>Is a given value a number?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isNumber</span></span> = (obj) -&gt; (obj <span class="keyword">is</span> +obj) <span class="keyword">or</span> toString.call(obj) <span class="keyword">is</span> <span class="string">'[object Number]'</span></pre></div></div>
</li>
<li id="section-81">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-81">&#182;</a>
</div>
<p>Is a given value a boolean?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isBoolean</span></span> = (obj) -&gt; obj <span class="keyword">is</span> <span class="literal">true</span> <span class="keyword">or</span> obj <span class="keyword">is</span> <span class="literal">false</span></pre></div></div>
</li>
<li id="section-82">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-82">&#182;</a>
</div>
<p>Is a given value a Date?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isDate</span></span> = (obj) -&gt; !!(obj <span class="keyword">and</span> obj.getTimezoneOffset <span class="keyword">and</span> obj.setUTCFullYear)</pre></div></div>
</li>
<li id="section-83">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-83">&#182;</a>
</div>
<p>Is the given value a regular expression?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isRegExp</span></span> = (obj) -&gt; !!(obj <span class="keyword">and</span> obj.exec <span class="keyword">and</span> (obj.ignoreCase <span class="keyword">or</span> obj.ignoreCase <span class="keyword">is</span> <span class="literal">false</span>))</pre></div></div>
</li>
<li id="section-84">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-84">&#182;</a>
</div>
<p>Is the given value NaN -- this one is interesting. <code>NaN != NaN</code>, and
<code>isNaN(undefined) == true</code>, so we make sure it&#39;s a number first.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isNaN</span></span> = (obj) -&gt; _.isNumber(obj) <span class="keyword">and</span> window.isNaN(obj)</pre></div></div>
</li>
<li id="section-85">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-85">&#182;</a>
</div>
<p>Is a given value equal to null?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isNull</span></span> = (obj) -&gt; obj <span class="keyword">is</span> <span class="literal">null</span></pre></div></div>
</li>
<li id="section-86">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-86">&#182;</a>
</div>
<p>Is a given variable undefined?</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">isUndefined</span></span> = (obj) -&gt; <span class="keyword">typeof</span> obj <span class="keyword">is</span> <span class="string">'undefined'</span></pre></div></div>
</li>
<li id="section-87">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-87">&#182;</a>
</div>
<h2>Utility Functions</h2>
</div>
</li>
<li id="section-88">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-88">&#182;</a>
</div>
<p>Run Underscore.js in noConflict mode, returning the <code>_</code> variable to its
previous owner. Returns a reference to the Underscore object.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">noConflict</span></span> = -&gt;
root._ = previousUnderscore
<span class="keyword">this</span></pre></div></div>
</li>
<li id="section-89">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-89">&#182;</a>
</div>
<p>Keep the identity function around for default iterators.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">identity</span></span> = (value) -&gt; value</pre></div></div>
</li>
<li id="section-90">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-90">&#182;</a>
</div>
<p>Run a function <code>n</code> times.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">times</span></span> = (n, iterator, context) -&gt;
iterator.call context, i <span class="keyword">for</span> i <span class="keyword">in</span> [<span class="number">0.</span>..n]</pre></div></div>
</li>
<li id="section-91">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-91">&#182;</a>
</div>
<p>Break out of the middle of an iteration.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">breakLoop</span></span> = -&gt; <span class="keyword">throw</span> breaker</pre></div></div>
</li>
<li id="section-92">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-92">&#182;</a>
</div>
<p>Add your own custom functions to the Underscore object, ensuring that
they&#39;re correctly added to the OOP wrapper as well.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">mixin</span></span> = (obj) -&gt;
<span class="keyword">for</span> name <span class="keyword">in</span> _.functions(obj)
addToWrapper name, _[name] = obj[name]</pre></div></div>
</li>
<li id="section-93">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-93">&#182;</a>
</div>
<p>Generate a unique integer id (unique within the entire client session).
Useful for temporary DOM ids.</p>
</div>
<div class="content"><div class='highlight'><pre>idCounter = <span class="number">0</span>
_.<span class="function"><span class="title">uniqueId</span></span> = (prefix) -&gt;
(prefix <span class="keyword">or</span> <span class="string">''</span>) + idCounter++</pre></div></div>
</li>
<li id="section-94">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-94">&#182;</a>
</div>
<p>By default, Underscore uses <strong>ERB</strong>-style template delimiters, change the
following template settings to use alternative delimiters.</p>
</div>
<div class="content"><div class='highlight'><pre>_.templateSettings = {
start: <span class="string">'&lt;%'</span>
end: <span class="string">'%&gt;'</span>
interpolate: <span class="regexp">/&lt;%=(.+?)%&gt;/g</span>
}</pre></div></div>
</li>
<li id="section-95">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-95">&#182;</a>
</div>
<p>JavaScript templating a-la <strong>ERB</strong>, pilfered from John Resig&#39;s
<em>Secrets of the JavaScript Ninja</em>, page 83.
Single-quote fix from Rick Strahl.
With alterations for arbitrary delimiters, and to preserve whitespace.</p>
</div>
<div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">template</span></span> = (str, data) -&gt;
c = _.templateSettings
endMatch = <span class="keyword">new</span> RegExp(<span class="string">"'(?=[^"</span>+c.end.substr(<span class="number">0</span>, <span class="number">1</span>)+<span class="string">"]*"</span>+escapeRegExp(c.end)+<span class="string">")"</span>,<span class="string">"g"</span>)
fn = <span class="keyword">new</span> Function <span class="string">'obj'</span>,
<span class="string">'var p=[],print=function(){p.push.apply(p,arguments);};'</span> +
<span class="string">'with(obj||{}){p.push(\''</span> +
str.replace(<span class="regexp">/\r/g</span>, <span class="string">'\\r'</span>)
.replace(<span class="regexp">/\n/g</span>, <span class="string">'\\n'</span>)
.replace(<span class="regexp">/\t/g</span>, <span class="string">'\\t'</span>)
.replace(endMatch,<span class="string">"✄"</span>)
.split(<span class="string">"'"</span>).join(<span class="string">"\\'"</span>)
.split(<span class="string">"✄"</span>).join(<span class="string">"'"</span>)
.replace(c.interpolate, <span class="string">"',$1,'"</span>)
.split(c.start).join(<span class="string">"');"</span>)
.split(c.end).join(<span class="string">"p.push('"</span>) +
<span class="string">"');}return p.join('');"</span>
<span class="keyword">if</span> data <span class="keyword">then</span> fn(data) <span class="keyword">else</span> fn</pre></div></div>
</li>
<li id="section-96">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-96">&#182;</a>
</div>
<h2>Aliases</h2>
</div>
</li>
<li id="section-97">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-97">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre>_.forEach = _.each
_.foldl = _.inject = _.reduce
_.foldr = _.reduceRight
_.select = _.filter
_.all = _.every
_.any = _.some
_.contains = _.include
_.head = _.first
_.tail = _.rest
_.methods = _.functions</pre></div></div>
</li>
<li id="section-98">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-98">&#182;</a>
</div>
<h2>Setup the OOP Wrapper</h2>
</div>
</li>
<li id="section-99">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-99">&#182;</a>
</div>
<p>If Underscore is called as a function, it returns a wrapped object that
can be used OO-style. This wrapper holds altered versions of all the
underscore functions. Wrapped objects may be chained.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="function"><span class="title">wrapper</span></span> = (obj) -&gt;
<span class="keyword">this</span>._wrapped = obj
<span class="keyword">this</span></pre></div></div>
</li>
<li id="section-100">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-100">&#182;</a>
</div>
<p>Helper function to continue chaining intermediate results.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="function"><span class="title">result</span></span> = (obj, chain) -&gt;
<span class="keyword">if</span> chain <span class="keyword">then</span> _(obj).chain() <span class="keyword">else</span> obj</pre></div></div>
</li>
<li id="section-101">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-101">&#182;</a>
</div>
<p>A method to easily add functions to the OOP wrapper.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="function"><span class="title">addToWrapper</span></span> = (name, func) -&gt;
wrapper.prototype[name] = -&gt;
args = _.toArray arguments
unshift.call args, <span class="keyword">this</span>._wrapped
result func.apply(_, args), <span class="keyword">this</span>._chain</pre></div></div>
</li>
<li id="section-102">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-102">&#182;</a>
</div>
<p>Add all ofthe Underscore functions to the wrapper object.</p>
</div>
<div class="content"><div class='highlight'><pre>_.mixin _</pre></div></div>
</li>
<li id="section-103">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-103">&#182;</a>
</div>
<p>Add all mutator Array functions to the wrapper.</p>
</div>
<div class="content"><div class='highlight'><pre>_.each [<span class="string">'pop'</span>, <span class="string">'push'</span>, <span class="string">'reverse'</span>, <span class="string">'shift'</span>, <span class="string">'sort'</span>, <span class="string">'splice'</span>, <span class="string">'unshift'</span>], (name) -&gt;
method = Array.prototype[name]
wrapper.prototype[name] = -&gt;
method.apply(<span class="keyword">this</span>._wrapped, arguments)
result(<span class="keyword">this</span>._wrapped, <span class="keyword">this</span>._chain)</pre></div></div>
</li>
<li id="section-104">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-104">&#182;</a>
</div>
<p>Add all accessor Array functions to the wrapper.</p>
</div>
<div class="content"><div class='highlight'><pre>_.each [<span class="string">'concat'</span>, <span class="string">'join'</span>, <span class="string">'slice'</span>], (name) -&gt;
method = Array.prototype[name]
wrapper.prototype[name] = -&gt;
result(method.apply(<span class="keyword">this</span>._wrapped, arguments), <span class="keyword">this</span>._chain)</pre></div></div>
</li>
<li id="section-105">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-105">&#182;</a>
</div>
<p>Start chaining a wrapped Underscore object.</p>
</div>
<div class="content"><div class='highlight'><pre>wrapper::<span class="function"><span class="title">chain</span></span> = -&gt;
<span class="keyword">this</span>._chain = <span class="literal">true</span>
<span class="keyword">this</span></pre></div></div>
</li>
<li id="section-106">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-106">&#182;</a>
</div>
<p>Extracts the result from a wrapped and chained object.</p>
</div>
<div class="content"><div class='highlight'><pre>wrapper::<span class="function"><span class="title">value</span></span> = -&gt; <span class="keyword">this</span>._wrapped</pre></div></div>
</li>
</ul>
</div>
</body>
</html>