lodash-contrib
Version:
The brass buckles on lodash's utility belt
200 lines (139 loc) • 7.26 kB
HTML
<html>
<head>
<title>_.util.trampolines.js.md</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 id="jump_to">
<li>
<a class="large" href="javascript:void(0);">Jump To …</a>
<a class="small" href="javascript:void(0);">+</a>
<div id="jump_wrapper">
<div id="jump_page_wrapper">
<div id="jump_page">
<a class="source" href="_.array.builders.js.html">
_.array.builders.js.md
</a>
<a class="source" href="_.array.selectors.js.html">
_.array.selectors.js.md
</a>
<a class="source" href="_.collections.walk.js.html">
_.collections.walk.js.md
</a>
<a class="source" href="_.function.arity.js.html">
_.function.arity.js.md
</a>
<a class="source" href="_.function.combinators.js.html">
_.function.combinators.js.md
</a>
<a class="source" href="_.function.iterators.js.html">
_.function.iterators.js.md
</a>
<a class="source" href="_.function.predicates.js.html">
_.function.predicates.js.md
</a>
<a class="source" href="_.object.builders.js.html">
_.object.builders.js.md
</a>
<a class="source" href="_.object.selectors.js.html">
_.object.selectors.js.md
</a>
<a class="source" href="_.util.existential.js.html">
_.util.existential.js.md
</a>
<a class="source" href="_.util.operators.js.html">
_.util.operators.js.md
</a>
<a class="source" href="_.util.strings.js.html">
_.util.strings.js.md
</a>
<a class="source" href="_.util.trampolines.js.html">
_.util.trampolines.js.md
</a>
<a class="source" href="index.html">
index.md
</a>
</div>
</div>
</li>
</ul>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>_.util.trampolines.js.md</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">¶</a>
</div>
<h3 id="util-trampolines">util.trampolines</h3>
<blockquote>
<p>Trampoline functions.</p>
</blockquote>
<hr>
</div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">¶</a>
</div>
<h4 id="done">done</h4>
<p><strong>Signature:</strong> <code>_.done(value:Any)</code></p>
<p>A utility for wrapping a function’s return values so they can be used by
<code>_.trampoline</code>. <a href="#trampoline">See below</a>.</p>
<hr>
</div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">¶</a>
</div>
<h4 id="trampoline">trampoline</h4>
<p><strong>Signature:</strong> <code>_.trampoline(fun:Function[, args:Any...])</code></p>
<p>Provides a way of creating recursive functions that won’t exceed a JavaScript
engine’s maximum recursion depth. Rather than writing a naive recursive
function, the function’s base cases must return <code>_.done(someValue)</code>, and
recursive calls must be wrapped in a returned function.</p>
<p>In order to create a trampolined function that can be used in the same way as
a naive recursive function, use <code>_.partial</code> as illustrated below.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">isEvenNaive</span> (<span class="hljs-params">num</span>) </span>{
<span class="hljs-keyword">if</span> (num === <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
<span class="hljs-keyword">if</span> (num === <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
<span class="hljs-keyword">return</span> isEvenNaive(num - <span class="hljs-number">2</span>);
}
isEvenNaive(<span class="hljs-number">99999</span>);
<span class="hljs-comment">// => InternalError: too much recursion</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">isEvenInner</span> (<span class="hljs-params">num</span>) </span>{
<span class="hljs-keyword">if</span> (num === <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> _.done(<span class="hljs-literal">true</span>);
<span class="hljs-keyword">if</span> (num === <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> _.done(<span class="hljs-literal">false</span>);
<span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">return</span> isEvenInner(<span class="hljs-built_in">Math</span>.abs(num) - <span class="hljs-number">2</span>); };
}
_.trampoline(isEvenInner, <span class="hljs-number">99999</span>);
<span class="hljs-comment">// => false</span>
<span class="hljs-keyword">var</span> isEven = _.partial(_.trampoline, isEvenInner);
isEven(<span class="hljs-number">99999</span>);
<span class="hljs-comment">// => false</span>
</code></pre>
<hr>
</div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">¶</a>
</div>
</div>
</li>
</ul>
</div>
</body>
</html>