mu2022-12-03T01:51:06+00:00Buzz de Cafemh@buzzdecafe.comA response to Paul English's "How to be a great programmer"2018-07-22T00:00:00+00:00/2018/07/22/a-response-to-paul-englishs-_how-to-be-a-great-programmer_
<style>
ol {
margin-bottom: 1.5em;
}
</style>
<blockquote>
<p>There are only two things you need to do to become a great, world-class programmer. First, you must maximize
customer impact, and second, you must maximize team output.</p>
<p>– <a href="https://www.linkedin.com/pulse/how-great-programmer-paul-english/">Paul English, <em>How to be a great programmer</em></a></p>
</blockquote>
<p>Paul English asserts there are merely two ingredients to becoming a “great, world-class programmer”. Unfortunately, the article does not
deliver on its title; it is not even <em>about</em> programming. The concerns of the article–namely, “maximizing customer impact”
and “maximize team performance”–are <em>architectural</em> concerns.</p>
<p>By “architectural” I am not even speaking about <em>application architecture</em>. No, I mean <em>enterprise architecture</em>, i.e. the discipline that deals with the question “What are the business priorities that drive technical decisions?” This kind of architectural thinking relies on defining one’s priorities, and then imposing a
<a href="sto">strict total order</a> on them.</p>
<p>We can tease out some of English’s architectural priorities and their order:</p>
<blockquote>
<p>you must make smart trade-offs of working quickly vs. working thoroughly. […] If you try to be thorough with all
tasks … this will result in your being able to do fewer tasks, of which a certain percent will fail. […]
the best engineers try to narrow scope of tasks so they can achieve and test them quickly with customers.</p>
</blockquote>
<p>This passage highlights the priorities <em>speed to market</em>, <em>the feedback loop</em>, and <em>thoroughness</em>.
That is also how English orders their importance.</p>
<p>The trade-off here is that we should expect to see more failures. The expectation is that several small
failures are less harmful than one large failure; and that small failures are more easily mitigated by
a rapid feedback loop.</p>
<p>A little later, more priorities are added:</p>
<blockquote>
<p>you must always write clean, understandable code.</p>
</blockquote>
<p>These terms are not defined, and for many programmers these terms are fraught. What is “clean”? “Understandable”
to whom? Making “understandibility” a priority runs the risk of reducing the team’s intelligence to the lowest common
denominator.</p>
<blockquote>
<p>[Clean, understandable code] gives super powers to other engineers who might have to change your code later.</p>
</blockquote>
<p>One could argue that the constraint of “clean, understandable” code is in conflict with the priority of “speed to market”.
But in this case, “speed to market” is the primary goal, and “understandability” is meant to serve that goal.
English prioritizes “understandability” because that enables rapid refactoring, and that helps optimize speed to market.</p>
<p>The dominance of speed to market as an architectural priority is pervasive in the article:</p>
<blockquote>
<p>When we try to accomplish tasks quickly, so that we can test many things with customers, the way to save time is not
to write crappy code, but instead, to narrow the initial scope of a task.</p>
</blockquote>
<p>Of course, one programmer’s “crappy code” is another’s JavaScript.</p>
<p>The priorities here include <em>teamwork</em>, and <em>understandibility/cleanliness</em>, which I take to be a synonym for “refacorability”.
Teamwork is higher priority than refactorability, although both are secondary to speed to market.</p>
<p>This struck me as an odd assertion:</p>
<blockquote>
<p>Speed is under-appreciated by most programmers. The best engineers always make sure that their code is fast …”</p>
</blockquote>
<p>I have not found this to be true. I have seen developers of all levels fetishize performance,
trying to squeeze microseconds out of some function without regard for whether such optimization <em>matters</em>.</p>
<p>As a <em>general</em> rule, I feel like you should only optimize code for performance when</p>
<ol>
<li>you know the code is correct, and</li>
<li>you can <em>prove</em> that the optimization is worth the cost.</li>
</ol>
<p>Writing performant code is not free, it involves trading off with other priorities. Focusing on performance
is almost always in conflict with “refactorability”. For English, in this case as well, performance is
necessary for a rapid feedback loop; and the feedback loop helps optimize speed to market:</p>
<blockquote>
<p>The best engineers always make sure that their code is fast, resulting in a customer experience of
ask-question-get-answer with as little delays as possible between those two things.</p>
</blockquote>
<p>The overall ordered list of priorities I gather from this article is:</p>
<ol>
<li>Speed to market</li>
<li>Feedback loop</li>
<li>Performance</li>
<li>Teamwork</li>
<li>Understandibility/Cleanliness/Refactorability</li>
</ol>
<p>...</p>
<ol start="100">
<li>Thoroughness</li>
</ol>
<p>I have no argument with these being Paul English’s priorities. He certainly knows what works for his business. I do have
two basic objections to the article:</p>
<ol>
<li>I object to the clickbait-and-switch title about becoming a great <em>programmer</em> when that is really not what the article is
about <em>at all</em>. Now, one could argue English is <em>really</em> saying that a programmer can increase their value to their employer
by being acutely aware of the architectural constraints of the business and using those to guide technical decisions.
I would not argue with that at all, that is practically a truism. But that is not what the article says. I would counter that the thesis of the article is explicitly about "greatness", not "value"; and its examples of "greatness" are all bound to particular architectural concerns, especially speed to market, as shown above.</li>
<li>I object to the assertion that "adhering to my priorities" is a recipe for "greatness" in general.</li>
</ol>
<p>It is not hard to imagine business scenarios where speed to market is not the primary concern, and in fact, could
be positively harmful. For example, consider developing a life-or-death medical device. Speed to market with a rapid feedback loop is not a
good fit for such a product: “Well, 60% of the patients died with v1, but we got version 2 out in two weeks and cut the
mortality rate to 48%!” In such a case, thoroughness, accuracy, correctness would (I hope) be higher priorities
than speed to market.</p>
<p>The tacit assumption in English’s definition is that “greatness” in programming may only occur in a business context.
A more apt title for the article might be “How to be a great employee for Paul English”. It is also not hard to
imagine a notion of “great programmer” outside of a business context. But that would be a whole other article.</p>
No, Promise is not a monad2018-04-10T00:00:00+00:00/2018/04/10/no-promises-are-not-monads
<blockquote>
<p>If you want to see how sloppy your thinking is, try writing. If you want to see how sloppy your writing is,
try writing math.<br />
– <em>Someone said this</em></p>
</blockquote>
<p>“Monad” is a well-defined mathematical object that must satisfy axioms known as <a href="https://wiki.haskell.org/Monad_laws">the monad laws</a>: Left Identity,
Right Identity, and Associativity. One way to implement a monad is to define the functions <code class="language-plaintext highlighter-rouge">return</code> and <code class="language-plaintext highlighter-rouge">bind</code> such
that they obey the monad laws. (And once you have that, you can derive other functions, as well.)</p>
<p><code class="language-plaintext highlighter-rouge">return :: a -> m a</code> is the “unit” operation for the monad <code class="language-plaintext highlighter-rouge">m</code>. Essentially, <code class="language-plaintext highlighter-rouge">return</code> takes any value and puts it
into the monadic context. The candidate for an analogous function on the <code class="language-plaintext highlighter-rouge">Promise</code> API is <code class="language-plaintext highlighter-rouge">resolve</code>. However,
because of the OO nature of JavaScript we can’t use <code class="language-plaintext highlighter-rouge">Promise.resolve</code> as a pure function.
I cannot simply write <code class="language-plaintext highlighter-rouge">.then(Promise.resolve)</code> – that gives me this delightful error: “Receiver of Promise.resolve
call is not a non-null object”. So to be fair, we can use the lambda <code class="language-plaintext highlighter-rouge">x => Promise.resolve(x)</code> as our <code class="language-plaintext highlighter-rouge">return</code>.</p>
<p><code class="language-plaintext highlighter-rouge">bind :: m a -> (a -> m b) -> m b</code> enables you to compose, flattening as you go. The analogous <code class="language-plaintext highlighter-rouge">Promise</code> function for
<code class="language-plaintext highlighter-rouge">bind</code> is <code class="language-plaintext highlighter-rouge">then</code>.</p>
<p>Note that in the examples below, the <code class="language-plaintext highlighter-rouge">≡</code> symbol in an expression like <code class="language-plaintext highlighter-rouge">a ≡ b</code> indicates that you can confidently
replace one side of <code class="language-plaintext highlighter-rouge">≡</code> with the other side, and your program will behave the same way.</p>
<p>The question is: Does <code class="language-plaintext highlighter-rouge">Promise</code> satisfy the monad laws?</p>
<h2 id="left-identity">Left Identity</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Promise.resolve(a).then(f) ≡ f(a)
</code></pre></div></div>
<p>Left Identity appears to hold as long as the function <code class="language-plaintext highlighter-rouge">f</code> that takes an <code class="language-plaintext highlighter-rouge">a</code> and returns a <code class="language-plaintext highlighter-rouge">Promise</code> (i.e. <code class="language-plaintext highlighter-rouge">a -> Promise b</code>).
But not quite. What if the type <code class="language-plaintext highlighter-rouge">a</code> is itself a <code class="language-plaintext highlighter-rouge">Promise</code>? Suppose <code class="language-plaintext highlighter-rouge">f</code> is</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>const f = p => p.then(n => n * 2)
</code></pre></div></div>
<p>In this example <code class="language-plaintext highlighter-rouge">f</code> is a function from <code class="language-plaintext highlighter-rouge">Promise Number -> Promise Number</code>. Let’s plug in a <code class="language-plaintext highlighter-rouge">Promise Number</code> for <code class="language-plaintext highlighter-rouge">a</code> to match up
with the expected input for <code class="language-plaintext highlighter-rouge">f</code>. Then we can evaluate the expression:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>const a = Promise.resolve(1)
const output = Promise.resolve(a).then(f)
// output :: RejectedPromise TypeError: p.then is not a function
</code></pre></div></div>
<p>The value that gets passed to <code class="language-plaintext highlighter-rouge">f</code> is implicitly unwrapped. It is a <code class="language-plaintext highlighter-rouge">TypeError</code> to pass a function to <code class="language-plaintext highlighter-rouge">then</code> that takes a <code class="language-plaintext highlighter-rouge">Promise</code>
for an argument. Note that we can evaluate the right-hand side of the equivalence to get a different result:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>const output = f(a)
// output :: ResolvedPromise 2
</code></pre></div></div>
<p>Therefore, Left Identity does not hold for <em>every</em> function of the form <code class="language-plaintext highlighter-rouge">a -> Promise b</code>: It only holds if <code class="language-plaintext highlighter-rouge">a</code> is
not itself a <code class="language-plaintext highlighter-rouge">Promise</code>.</p>
<h2 id="right-identity">Right Identity</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p.then(x => Promise.resolve(x)) ≡ p
</code></pre></div></div>
<p>This holds (where <code class="language-plaintext highlighter-rouge">p</code> is some <code class="language-plaintext highlighter-rouge">Promise</code>).</p>
<h2 id="associativity">Associativity</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p.then(f).then(g) ≡ p.then(x => f(x).then(g))
</code></pre></div></div>
<p>As with Left Identity above, Associativity is only satisifed if <code class="language-plaintext highlighter-rouge">f</code> and <code class="language-plaintext highlighter-rouge">g</code> play nice. If <code class="language-plaintext highlighter-rouge">f</code> or <code class="language-plaintext highlighter-rouge">g</code> take a <code class="language-plaintext highlighter-rouge">Promise</code>
argument, then, for the same reason as shown above, this law will not hold.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Failing to satisfy one law would have been sufficient to disqualify <code class="language-plaintext highlighter-rouge">Promise</code> from being a monad. The examples
above show that <code class="language-plaintext highlighter-rouge">Promise</code> satisfies only one out of three: Right Identity.</p>
<h2 id="is-this-a-problem">Is this a problem?</h2>
<p>Laws matter. They can give you confidence about the properties of the code you write, and how you can rewrite it.
They permit you to port concepts across languages – to the extent the language can support them.
On the other hand, if you are using JavaScript, then lawfulness may not be a priority.</p>
Chain, chain, chain2016-12-29T00:00:00+00:00/2016/12/29/chain-chain-chain
<p>Consider this problem, from a <a href="http://stackoverflow.com/questions/40026018/using-ramda-and-pointfree-style-how-can-i-copy-the-first-item-of-an-array-to-t/40028255#40028255">question on stack overflow</a>.
Given a list <code class="language-plaintext highlighter-rouge">x::xs</code>, how can one write a function <code class="language-plaintext highlighter-rouge">f</code> that will output <code class="language-plaintext highlighter-rouge">x::xs::x</code>? In other
words, write a function that takes the head of the list and appends it to the end of the
list?</p>
<p>The description above almost writes the function for us. Here are the component parts:</p>
<ul>
<li>
<p><em>Take the head of the list</em>: We have a function for that: <code class="language-plaintext highlighter-rouge">head</code>. Note the type of <code class="language-plaintext highlighter-rouge">head</code>:</p>
<p><code class="language-plaintext highlighter-rouge">head :: [x] -> x</code></p>
<p>That signature simply says that when you give <code class="language-plaintext highlighter-rouge">head</code> a list, it will return
the first element of that list.</p>
</li>
<li>
<p><em>Append it to the end of the list</em>: We have a function for that as well: <code class="language-plaintext highlighter-rouge">append</code>. The type
of <code class="language-plaintext highlighter-rouge">append</code> is:</p>
<p><code class="language-plaintext highlighter-rouge">append :: x -> [x] -> [x]</code></p>
<p>When you give <code class="language-plaintext highlighter-rouge">append</code> an element and a list, it gives you
back a new list with the element at the end.</p>
</li>
</ul>
<p>What will our function <code class="language-plaintext highlighter-rouge">f</code> look like?</p>
<ul>
<li>It will be of the type <code class="language-plaintext highlighter-rouge">[x] -> [x]</code></li>
<li>It will be composed of the parts above, viz. <code class="language-plaintext highlighter-rouge">head :: [x] -> x</code> and
<code class="language-plaintext highlighter-rouge">append :: x -> [x] -> [x]</code>.</li>
<li>Somehow we have to get the output of <code class="language-plaintext highlighter-rouge">head</code> fed into <code class="language-plaintext highlighter-rouge">append</code> to get us a new
function <code class="language-plaintext highlighter-rouge">[x] -> [x]</code>.</li>
</ul>
<p>Before I pull a rabbit out of this hat, a few words about
<a href="http://ramdajs.com/docs/#chain"><code class="language-plaintext highlighter-rouge">chain</code></a>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chain :: Chain m => (a -> m b) -> m a -> m b
</code></pre></div></div>
<p>Let’s break this signature down into bite-sized pieces and digest them one-by-one.</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">Chain m</code>: There is some <em>thing</em> <code class="language-plaintext highlighter-rouge">m</code> that is a <code class="language-plaintext highlighter-rouge">Chain</code>.</li>
<li><code class="language-plaintext highlighter-rouge">=></code>: This tells us that whenever we see an <code class="language-plaintext highlighter-rouge">m</code> in the rest of the singature,
we know it is a <code class="language-plaintext highlighter-rouge">Chain</code> <em>thing</em>.</li>
<li><code class="language-plaintext highlighter-rouge">(a -> m b)</code>: The first argument to <code class="language-plaintext highlighter-rouge">chain</code> is a function from some type <code class="language-plaintext highlighter-rouge">a</code>
to a <code class="language-plaintext highlighter-rouge">Chain</code> that “contains” a value of type <code class="language-plaintext highlighter-rouge">b</code>.</li>
<li><code class="language-plaintext highlighter-rouge">m a</code>: The second argument to <code class="language-plaintext highlighter-rouge">chain</code> is a <code class="language-plaintext highlighter-rouge">Chain</code> wrapping a value of type <code class="language-plaintext highlighter-rouge">a</code>.</li>
<li><code class="language-plaintext highlighter-rouge">m b</code>: This is our return type. <code class="language-plaintext highlighter-rouge">chain</code> will return a <code class="language-plaintext highlighter-rouge">Chain</code> wrapping a value <code class="language-plaintext highlighter-rouge">b</code>.</li>
</ul>
<p>Here is an example of <code class="language-plaintext highlighter-rouge">chain</code>. It is often called <code class="language-plaintext highlighter-rouge">flatMap</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">const</span> <span class="nx">dup</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">=></span> <span class="p">[</span><span class="nx">x</span><span class="p">,</span> <span class="nx">x</span><span class="p">];</span>
<span class="nx">chain</span><span class="p">(</span><span class="nx">dup</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]);</span> <span class="c1">//=> [1, 1, 2, 2, 3, 3]</span>
</code></pre></figure>
<p>In this example,</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">(a -> m b)</code> is the function <code class="language-plaintext highlighter-rouge">dup</code>, <code class="language-plaintext highlighter-rouge">a</code> is <code class="language-plaintext highlighter-rouge">Number</code>, and the <code class="language-plaintext highlighter-rouge">Chain</code> <code class="language-plaintext highlighter-rouge">m b</code> is
an Array of Numbers.</li>
<li>The <code class="language-plaintext highlighter-rouge">Chain</code> <code class="language-plaintext highlighter-rouge">m a</code> is an Array of Numbers.</li>
<li>The returned value <code class="language-plaintext highlighter-rouge">m b</code> is the same type as <code class="language-plaintext highlighter-rouge">m a</code>: A <code class="language-plaintext highlighter-rouge">Chain</code> of an Array of Numbers.</li>
<li>Note that in this example, both type variables <code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code> refer to the same type:
an Array of Numbers. Likewise, <code class="language-plaintext highlighter-rouge">m a</code> and <code class="language-plaintext highlighter-rouge">m b</code> both refer to a <code class="language-plaintext highlighter-rouge">Chain</code> of an
Array of Numbers. This need not always be the case, but it is also not a problem when it
is the case.</li>
</ul>
<p>It should be pretty clear how <code class="language-plaintext highlighter-rouge">chain</code> works in the context of Array of <em>Something</em>. In this case, though,
we want to output a Function <code class="language-plaintext highlighter-rouge">f</code>. Is Function a <code class="language-plaintext highlighter-rouge">Chain</code>?</p>
<p>Recall the signature:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">chain</span> <span class="p">::</span> <span class="nx">Chain</span> <span class="nx">m</span> <span class="o">=></span> <span class="p">(</span><span class="nx">a</span> <span class="o">-></span> <span class="nx">m</span> <span class="nx">b</span><span class="p">)</span> <span class="o">-></span> <span class="nx">m</span> <span class="nx">a</span> <span class="o">-></span> <span class="nx">m</span> <span class="nx">b</span>
</code></pre></figure>
<p>Replace <code class="language-plaintext highlighter-rouge">Chain m => m</code> with <code class="language-plaintext highlighter-rouge">Function x</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">chain</span> <span class="p">::</span> <span class="p">(</span><span class="nx">a</span> <span class="o">-></span> <span class="nb">Function</span> <span class="nx">x</span> <span class="nx">b</span><span class="p">)</span> <span class="o">-></span> <span class="nb">Function</span> <span class="nx">x</span> <span class="nx">a</span> <span class="o">-></span> <span class="nb">Function</span> <span class="nx">x</span> <span class="nx">b</span>
</code></pre></figure>
<p>You can look at a function from <code class="language-plaintext highlighter-rouge">x</code> to <code class="language-plaintext highlighter-rouge">a</code> as a <em>wrapper</em> around its return value <code class="language-plaintext highlighter-rouge">a</code>.
It is analogous to an Array wrapping its elements.</p>
<p>Now use <code class="language-plaintext highlighter-rouge">x -> y</code> as sugar for <code class="language-plaintext highlighter-rouge">Function x y</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">chain</span> <span class="p">::</span> <span class="p">(</span><span class="nx">a</span> <span class="o">-></span> <span class="nx">x</span> <span class="o">-></span> <span class="nx">b</span><span class="p">)</span> <span class="o">-></span> <span class="p">(</span><span class="nx">x</span> <span class="o">-></span> <span class="nx">a</span><span class="p">)</span> <span class="o">-></span> <span class="p">(</span><span class="nx">x</span> <span class="o">-></span> <span class="nx">b</span><span class="p">)</span>
</code></pre></figure>
<p>Adding an extra pair parenthesis to make this clearer:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">chain</span> <span class="p">::</span> <span class="p">(</span><span class="nx">a</span> <span class="o">-></span> <span class="p">(</span><span class="nx">x</span> <span class="o">-></span> <span class="nx">b</span><span class="p">))</span> <span class="o">-></span> <span class="p">(</span><span class="nx">x</span> <span class="o">-></span> <span class="nx">a</span><span class="p">)</span> <span class="o">-></span> <span class="p">(</span><span class="nx">x</span> <span class="o">-></span> <span class="nx">b</span><span class="p">)</span>
<span class="o">^^^^^^</span> <span class="o">^^^^^^</span> <span class="o">^^^^^^</span>
<span class="c1">// analogous to: m b m a m b</span>
<span class="c1">// analogous to: [b] [a] [b]</span>
</code></pre></figure>
<p>That looks like it should work! Let’s compare this <code class="language-plaintext highlighter-rouge">chain</code> signature with the components
we are going to use to build <code class="language-plaintext highlighter-rouge">f</code>:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">f :: [x] -> [x]</code></li>
<li><code class="language-plaintext highlighter-rouge">head :: [x] -> x</code></li>
<li><code class="language-plaintext highlighter-rouge">append :: x -> [x] -> [x]</code></li>
</ul>
<p><code class="language-plaintext highlighter-rouge">append</code> is of type <code class="language-plaintext highlighter-rouge">a -> m b</code>; <code class="language-plaintext highlighter-rouge">head</code> is of type <code class="language-plaintext highlighter-rouge">m a</code>. Recall that what we are trying
to produce is a function <code class="language-plaintext highlighter-rouge">f</code> of type <code class="language-plaintext highlighter-rouge">m b</code>. Now our types line up perfectly:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">const</span> <span class="nx">f</span> <span class="o">=</span> <span class="nx">chain</span><span class="p">(</span><span class="nx">append</span><span class="p">,</span> <span class="nx">head</span><span class="p">);</span> <span class="c1">//=> f :: [x] -> [x]`</span>
<span class="nx">f</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]);</span> <span class="c1">//=> [1, 2, 3, 1]</span>
</code></pre></figure>
<p><img src="/assets/img/rabbit-hat-sherlock.gif" alt="ta-da" style="display:block; margin:auto" /></p>
<p>But wait – there’s more! Does this mean that you can do this with any function
that satisfies those signatures? That’s exactly what it means. For example, you could
<code class="language-plaintext highlighter-rouge">chain</code> <code class="language-plaintext highlighter-rouge">toLower</code> and <code class="language-plaintext highlighter-rouge">concat</code> over a String:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">chain</span><span class="p">(</span><span class="nx">concat</span><span class="p">,</span> <span class="nx">toLower</span><span class="p">)(</span><span class="dl">"</span><span class="s2">ABCD</span><span class="dl">"</span><span class="p">);</span> <span class="c1">//=> "abcdABCD"</span>
</code></pre></figure>
<p>… or <code class="language-plaintext highlighter-rouge">chain</code> <code class="language-plaintext highlighter-rouge">assoc(keyname)</code> and <code class="language-plaintext highlighter-rouge">keys</code> over an Object:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">chain</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">assoc</span><span class="p">(</span><span class="dl">'</span><span class="s1">keylist</span><span class="dl">'</span><span class="p">),</span> <span class="nx">keys</span><span class="p">)({</span><span class="na">a</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">b</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="mi">3</span><span class="p">});</span> <span class="c1">//=> {a: 1, b: 2, c: 3, keylist: ['a', 'b', 'c']}</span>
</code></pre></figure>
<p>… and so on.</p>
<p>You may be surprised to learn that was a demonstration of how <code class="language-plaintext highlighter-rouge">Function</code> is a Monad.
Proving that – by defining <code class="language-plaintext highlighter-rouge">join</code> and <code class="language-plaintext highlighter-rouge">return</code> for Function and showing that it satisfies
associativity, left identity, and right identity is left as an exercise for the reader.</p>
Exceptional composition2016-02-05T00:00:00+00:00/code/2016/02/05/exceptional-composition
<p>Lately I’ve been studying OCaml. It’s a very nice language. In grad school I
worked with Standard ML a bit, but never got a good feel for it. OCaml feels
very comfortable, although I am still learning to write idiomatically.</p>
<p>OCaml will let you be as pure as you need to be, but will also let you wallow
in the gutter of mutable variables if you need to. It is less judgmental than
some other languages.</p>
<p>One of these compromises is in how OCaml uses exceptions. That got me thinking
about handling exceptions in ramda. For example, suppose you have a list of a
billion integers, and you need to get a product over the whole list:</p>
<figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"> <span class="c">(* product : int list -> int *)</span>
<span class="k">let</span> <span class="k">rec</span> <span class="n">product</span> <span class="o">=</span> <span class="k">function</span>
<span class="o">|</span> <span class="bp">[]</span> <span class="o">-></span> <span class="mi">1</span>
<span class="o">|</span> <span class="n">x</span><span class="o">::</span><span class="n">xs</span> <span class="o">-></span> <span class="n">x</span> <span class="o">*</span> <span class="p">(</span><span class="n">product</span> <span class="n">xs</span><span class="p">)</span>
</code></pre></figure>
<p>This is a bit naive. The biggest problem is what if I encounter a zero? At
that point I know that the whole product will be zero. I can stop multiplying.
Adding an <code class="language-plaintext highlighter-rouge">if</code> check doesn’t quite solve the problem:</p>
<figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"> <span class="o">|</span> <span class="n">x</span><span class="o">::</span><span class="n">xs</span> <span class="o">-></span> <span class="k">if</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">then</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">x</span> <span class="o">*</span> <span class="p">(</span><span class="n">product</span> <span class="n">xs</span><span class="p">)</span>
</code></pre></figure>
<p>What if zero is the last integer in the list? I have built up nearly a billion
recursive calls in my stack that I still have to unwind. This is the kind of
grimy, real-world consideration that some functional programmers like to sweep
under the rug.</p>
<p>OCaml lets you solve this very nicely using exceptions. In the example above
I could define an exception <code class="language-plaintext highlighter-rouge">Zero</code> and raise it if I encounter a zero in my list:</p>
<figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"> <span class="k">exception</span> <span class="nc">Zero</span>
<span class="c">(* product : int list -> int *)</span>
<span class="k">let</span> <span class="k">rec</span> <span class="n">product</span> <span class="o">=</span> <span class="k">function</span>
<span class="o">|</span> <span class="bp">[]</span> <span class="o">-></span> <span class="mi">1</span>
<span class="o">|</span> <span class="n">x</span><span class="o">::</span><span class="n">xs</span> <span class="o">-></span> <span class="k">if</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">then</span> <span class="k">raise</span> <span class="nc">Zero</span> <span class="k">else</span> <span class="n">x</span> <span class="o">*</span> <span class="p">(</span><span class="n">product</span> <span class="n">xs</span><span class="p">)</span>
</code></pre></figure>
<p>Now we have to handle the exception:</p>
<figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"> <span class="k">try</span> <span class="n">product</span> <span class="n">billion_ints</span> <span class="k">with</span> <span class="nc">Zero</span> <span class="o">-></span> <span class="mi">0</span>
</code></pre></figure>
<p>How nice is that? The exception will short-circuit the evaluation, throw away
any stack I have built up, and return me an answer.</p>
<p>Unfortunately, there is nothing in the signature to indicate that this function
might raise an exception:</p>
<figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"> <span class="k">val</span> <span class="n">product</span> <span class="o">:</span> <span class="kt">int</span> <span class="kt">list</span> <span class="o">-></span> <span class="kt">int</span> <span class="o">=</span> <span class="o"><</span><span class="k">fun</span><span class="o">></span>
</code></pre></figure>
<p>I can get a “safe” function by wrapping up <code class="language-plaintext highlighter-rouge">product</code> inside a function that will
trap the raised exception:</p>
<figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"> <span class="k">let</span> <span class="n">safe_product</span> <span class="n">ints</span> <span class="o">=</span> <span class="k">try</span> <span class="n">product</span> <span class="n">ints</span> <span class="k">with</span> <span class="nc">Zero</span> <span class="o">-></span> <span class="mi">0</span>
</code></pre></figure>
<hr />
<p>I thought this was really nice syntax, and got me thinking that we could use a
function in ramda that would wrap exceptions and let the composition keep
rolling along. One approach to doing that is to use a data type like <code class="language-plaintext highlighter-rouge">Maybe</code> or
<code class="language-plaintext highlighter-rouge">Either</code> to wrap up the value. That is fine for some cases, but it means you will be
<code class="language-plaintext highlighter-rouge">map</code>-ping the rest of the way down your composition. That may be overdoing it
sometimes.</p>
<p>So I added a simple function <code class="language-plaintext highlighter-rouge">tryCatch</code>:</p>
<figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"> <span class="n">tryCatch</span> <span class="o">:</span> <span class="p">(</span><span class="n">a</span> <span class="o">-></span> <span class="n">b</span><span class="p">)</span> <span class="o">-></span> <span class="p">((</span><span class="n">e</span><span class="o">,</span> <span class="n">a</span><span class="p">)</span> <span class="o">-></span> <span class="n">b</span><span class="p">)</span> <span class="o">-></span> <span class="n">a</span> <span class="o">-></span> <span class="n">b</span>
</code></pre></figure>
<p><code class="language-plaintext highlighter-rouge">tryCatch</code> evaluates the first function (i.e. <code class="language-plaintext highlighter-rouge">a -> b</code>). If it does not throw, it
returns <code class="language-plaintext highlighter-rouge">b</code>. If it <em>does</em> throw, then the second function catches the exception.
It is evaluated with the thrown <code class="language-plaintext highlighter-rouge">Error</code> and the original arguments, and must return
something of type <code class="language-plaintext highlighter-rouge">b</code>. <em>Et voila!</em> You can compose with exceptions.</p>
<p>The usual JavaScript caveats apply; The second function <em>must</em> return the same type
as the first function. It is up to the user to enforce this, since JavaScript
will offer no help in this regard. And, of course, the syntax is nowhere near as nice
as OCaml’s. And it’s unlikely there is any performance benefit to this approach
in JavaScript, but there definitely is an advantage in OCaml.</p>
<p>On the other hand, exceptions are a fact of life in JavaScript. So it feels right
that ramda should provide some way to deal with them.</p>
<p><code class="language-plaintext highlighter-rouge">tryCatch</code> will be introduced in ramda 0.20.</p>
Is JavaScript getting worse?2015-01-08T00:00:00+00:00/code/2015/01/08/is-javascript-getting-worse
<blockquote>
<p>Any headline which ends in a question mark can be answered by the word “no.”<br />
– <a href="https://en.wikipedia.org/wiki/Betteridge%27s_law_of_headlines">Betteridge’s law of headlines</a></p>
</blockquote>
<p>There is a lot of anticipation about the next release of JavaScript,
<a href="http://tc39wiki.calculist.org/es6/">ES6</a>. There are certainly going to be some very nice
features:</p>
<ul>
<li><a href="http://tc39wiki.calculist.org/es6/arrow-functions">Fat arrow (<code class="language-plaintext highlighter-rouge">=></code>) syntax</a></li>
<li><a href="http://tc39wiki.calculist.org/es6/spread/">Spread operator</a></li>
<li>Best of all, <a href="http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls">proper tail calls</a></li>
</ul>
<p>But JavaScript is not content merely to improve. It has to maintain – and even increase –
its lead in WTF’s per minute.</p>
<p><strong>Classes.</strong> Whoop-dee-freakin’-doo. Very hard to get excited about quadrupling down on a
bad bet.</p>
<p><strong>Default parameters.</strong> By itself, this is another “so what” feature. But default parameters
have an obnoxious side effect: <a href="http://tc39wiki.calculist.org/es6/default-parameter-values/">They are not reflected in the function’s
<code class="language-plaintext highlighter-rouge">length</code> property</a>.
This makes currying tricky indeed. With <a href="http://ramdajs.com">Ramda</a> you
could hack around this infirmity by specifying arity when currying with <code class="language-plaintext highlighter-rouge">curryN</code>, but
geez. C’mon, man.</p>
<p><strong><code class="language-plaintext highlighter-rouge">let</code> considered harmful</strong>
The
problem with <code class="language-plaintext highlighter-rouge">let</code> is that it is not “hoisted” to the top of its block, as <code class="language-plaintext highlighter-rouge">var</code> is with
its containing function. So if you:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="dl">"</span><span class="s2">use strict</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}())</span>
</code></pre></figure>
<p>you will get “ReferenceError: can’t access lexical declaration ‘x’ before initialization.”
<a href="http://es-discourse.com/t/why-typeof-is-no-longer-safe/15"><em>This means that <code class="language-plaintext highlighter-rouge">typeof</code> can now <strong>throw</strong></em></a>.
It’s like the <code class="language-plaintext highlighter-rouge">let</code> keyword has inadvertently introduced a new kind of nil value to a
language that already has at least one too many.</p>
<p>So is Javascript getting worse? Well … no. But that doesn’t mean it’s only getting better.</p>
Functors and Applicatives2014-10-26T00:00:00+00:00/code/2014/10/26/functors-and-applicatives
<p>I recently gave a talk at <a href="http://hartfordjs.com/">Hartford JS</a> on Functors and Applicatives in JavaScript.
This subject assumes familiarity with <a href="http://fr.umio.us/favoring-curry/">currying</a> and
<a href="http://fr.umio.us/favoring-curry/">function composition</a>. You can also look over the <a href="http://rawgit.com/buzzdecafe/pres/master/algebra.html">original slide
deck</a>.</p>
<p><strong>Q:</strong> When is a function not a function?</p>
<p><strong>A:</strong> When it is a <em>method</em>.</p>
<p>We’re talking here about <em>functions</em> and not <em>methods</em>. For the purposes of this discussion,
a <em>function</em>:</p>
<ul>
<li>Maps some input <code class="language-plaintext highlighter-rouge">a</code> to some output <code class="language-plaintext highlighter-rouge">b</code>;</li>
<li>For any input <code class="language-plaintext highlighter-rouge">a</code>, there is only one output <code class="language-plaintext highlighter-rouge">b</code> (although any <code class="language-plaintext highlighter-rouge">b</code> may be mapped to by more than one <code class="language-plaintext highlighter-rouge">a</code>);</li>
<li>Does not mutate any state, encapsulated or otherwise, nor does it produce side effects.</li>
</ul>
<p>Contrast this with a <em>method</em>:</p>
<ul>
<li>May return something, or not;</li>
<li>May return a different <code class="language-plaintext highlighter-rouge">b</code> for an input <code class="language-plaintext highlighter-rouge">a</code>;</li>
<li>May mutate state somewhere. May produce side effects.</li>
</ul>
<hr />
<p>Let’s look at a simple example function. You want to take your cat to the vet to get a shot for it.</p>
<figure class="illo">
<img src="/assets/img/cat2cat.png" />
<figcaption>A function from Cat → Cat</figcaption>
</figure>
<p>Here we have a simple function from Cat to Cat. We input a cat <code class="language-plaintext highlighter-rouge">a</code> on the left,
and we get out an immunized cat <code class="language-plaintext highlighter-rouge">b</code> on the right.
It’s important to note that we <em>should not mutate the input cat</em>. What should happen
instead is we input cat <code class="language-plaintext highlighter-rouge">a</code> on the left, and get out a <em>brand new cat that is immunized</em>.
Then cat <code class="language-plaintext highlighter-rouge">a</code> can be made available for garbage collection.</p>
<figure class="illo">
<img src="/assets/img/cat_gc.png" />
<figcaption>Cat ready for garbage collection</figcaption>
</figure>
<p>Of course, there’s no guarantee that people coming into the vet’s office have a cat–or any pet at all,
for that matter. If someone brings a <code class="language-plaintext highlighter-rouge">null</code> where we are expecting a Cat, then our nice function from
Cat to Cat doesn’t work so well:</p>
<figure class="illo">
<img src="/assets/img/nullcat.png" />
<figcaption>A function from <del>Cat → Cat</del> null → Shit</figcaption>
</figure>
<p>We could have the vet ask everything that comes by if it is <code class="language-plaintext highlighter-rouge">null</code> or not. But that is not his job, really. His
job is giving shots to pets. I don’t want all of my functions littered with <code class="language-plaintext highlighter-rouge">null</code> checks. Surely, there must be
some way to keep my functions clean and simple, yet make them <code class="language-plaintext highlighter-rouge">null</code>-safe as well?</p>
<p>The answer is “Maybe”–more specifically, the “Maybe Functor”.</p>
<p>Note that when you are composing functions, all the functions in the composition have to
fulfill their contracts. If somebody returns a <code class="language-plaintext highlighter-rouge">null</code> in there, the whole daisy chain is borked. Consider:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// capitalize :: String -> String</span>
<span class="kd">var</span> <span class="nx">capitalize</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">compose</span><span class="p">(</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">,</span> <span class="c1">// String -> String</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="dl">'</span><span class="s1">textContent</span><span class="dl">'</span><span class="p">),</span> <span class="c1">// Object -> String</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">,</span> <span class="nb">document</span><span class="p">)</span> <span class="c1">// String -> DOMElement</span>
<span class="p">);</span>
</code></pre></figure>
<p>What happens if the call to <code class="language-plaintext highlighter-rouge">getElementById</code> doesn’t find anything? You get a <code class="language-plaintext highlighter-rouge">null</code> back. Then
that <code class="language-plaintext highlighter-rouge">null</code> gets fed to <code class="language-plaintext highlighter-rouge">R.prop</code>, and <code class="language-plaintext highlighter-rouge">R.prop</code> will fail.</p>
<p>To get around this problem, we can use a <em>Functor</em>.</p>
<figure class="illo">
<img src="/assets/img/catfunctor.png" />
<figcaption>The same function Cat → Cat, applied by mapping</figcaption>
</figure>
<p>A <em>Functor</em> is an object that can be mapped over. By “map” I mean that we can use the same function
from Cat to Cat even though the Cat is now inside a container. Note that in the example above,
The cat is in the kitty carrier, but we we are still using the same immunization function.</p>
<p>This is a big deal, because it allows us keep the <code class="language-plaintext highlighter-rouge">null</code>-checking separate from the internal logic of
the function. Now if we get an empty container for input, then there is no reason to even try to apply the
function to its content. We simply get an empty container back.</p>
<figure class="illo">
<img src="/assets/img/catsafe.png" />
<figcaption>The same function Cat → Cat, now null safe!</figcaption>
</figure>
<p>This example is essentially the “Maybe” functor. “Maybe” let’s you wrap up a function from <code class="language-plaintext highlighter-rouge">a</code> to <code class="language-plaintext highlighter-rouge">b</code>
so that you can apply it to the contents of the Maybe. <a href="https://github.com/ramda/ramda-fantasy/blob/master/src/Maybe.js">Take a look at how we have implemented <code class="language-plaintext highlighter-rouge">Maybe</code> in Ramda Fantasy</a>.
You can see that <code class="language-plaintext highlighter-rouge">Maybe</code> is a sum type; it is a <code class="language-plaintext highlighter-rouge">Just</code> of some value, or it is <code class="language-plaintext highlighter-rouge">Nothing</code>.
You can use the direct your composition into the proper channel with something like:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">fromNullable</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">x</span> <span class="o">==</span> <span class="kc">null</span> <span class="p">?</span> <span class="nx">Maybe</span><span class="p">.</span><span class="nx">Nothing</span> <span class="p">:</span> <span class="nx">Maybe</span><span class="p">.</span><span class="nx">Just</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></figure>
<p>Now let’s go back to the <code class="language-plaintext highlighter-rouge">capitalize</code> example. We can rewrite that to make use of the Maybe functor:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// capitalize :: String -> Maybe String</span>
<span class="kd">var</span> <span class="nx">capitalize</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">compose</span><span class="p">(</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">),</span> <span class="c1">// Maybe String -> Maybe String</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="dl">'</span><span class="s1">textContent</span><span class="dl">'</span><span class="p">)),</span> <span class="c1">// Maybe Object -> Maybe String</span>
<span class="nx">fromNullable</span><span class="p">,</span> <span class="c1">// Object -> Maybe Object</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">,</span> <span class="nb">document</span><span class="p">)</span> <span class="c1">// String -> DOMElement</span>
<span class="p">);</span>
</code></pre></figure>
<p>Now this function is guaranteed to output something–Maybe. If the call to <code class="language-plaintext highlighter-rouge">getElementById</code> fails,
we’ll wind up with a <code class="language-plaintext highlighter-rouge">Maybe null</code> at the end; otherwise we’ll have a <code class="language-plaintext highlighter-rouge">Maybe String</code>. We didn’t have
to guard inside our functions, so that is nice. Instead, we have wrapped up the value we are composing
over inside this container. So we can only access the value by mapping over the container.</p>
<p>(Well, actually, since this is JavaScript, and <code class="language-plaintext highlighter-rouge">value</code> is sitting there as a public property on <code class="language-plaintext highlighter-rouge">Maybe</code>,
you could just query it. But then you are right back where you started, needing to test for <code class="language-plaintext highlighter-rouge">null</code>.)</p>
<p>The Maybe functor only gives us one bit of information: Did we hit a <code class="language-plaintext highlighter-rouge">null</code> somewhere along the way or not?
There are other functors that can wrap up more info. The Either functor is either a Left or a Right;
In the Left you can put an error message (or a function, or whatever). If it is a Right, then everything
ran fine.</p>
<p>Promises can also be looked at as functors. Consider:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="p">},</span> <span class="nb">Promise</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span> <span class="c1">//=> Promise(3)</span>
</code></pre></figure>
<p>There are many, many more ways to skin this cat: Validation, IO, Reader, Writer, State, Future …
and of course Array.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="p">},</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span> <span class="p">,</span><span class="mi">30</span><span class="p">]);</span> <span class="c1">//=> [11, 21, 31]</span>
</code></pre></figure>
<p>Arrays are Functors. After all, it’s a container you can map over. Arrays are a bit trickier, though,
since they are intertwined with the notion of iteration.</p>
<p>No reason to stop here, though. We can wrap up the object we’re mapping over in a Functor. We can also
wrap up the <em>function we want to apply</em> inside a container:</p>
<figure class="illo">
<img src="/assets/img/apply.png" />
<figcaption>Applying a wrapped function to a wrapped value</figcaption>
</figure>
<p>Once again, it’s the <em>same function from Cat to Cat</em>, but now both function and data are wrapped in containers. The good folks
from <a href="https://github.com/fantasyland/fantasy-land">Fantasy Land</a> call an object that can handle this
situation an “Apply”, and the function you
use to apply a wrapped function to a wrapped value is <code class="language-plaintext highlighter-rouge">ap</code>. For Maybe, that could look like this:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">Maybe</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">ap</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">vs</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">(</span><span class="k">typeof</span> <span class="k">this</span><span class="p">.</span><span class="nx">value</span> <span class="o">!==</span> <span class="dl">'</span><span class="s1">function</span><span class="dl">'</span><span class="p">)</span> <span class="p">?</span> <span class="k">new</span> <span class="nx">Maybe</span><span class="p">(</span><span class="kc">null</span><span class="p">)</span> <span class="p">:</span> <span class="nx">vs</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
<span class="p">};</span>
</code></pre></figure>
<p>The implementation of <code class="language-plaintext highlighter-rouge">ap</code> for Array is a bit more complicated, of course, because of iteration:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">ap</span> <span class="o">=</span> <span class="nx">curry</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">fns</span><span class="p">,</span> <span class="nx">vs</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">foldl</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">fn</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">concat</span><span class="p">(</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">map</span><span class="p">(</span><span class="nx">fn</span><span class="p">,</span> <span class="nx">vs</span><span class="p">));</span>
<span class="p">},</span> <span class="p">[],</span> <span class="nx">fns</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></figure>
<p>Maybe you are asking yourself, “How do you get into a situation where you have a function inside a container?”
<a href="/code/2014/08/12/applicatives-ramda-style/">I covered such a situation recently</a>. That article also covers the
ability to create an Applicative, by wrapping up an arbitrary object inside a container via <code class="language-plaintext highlighter-rouge">of</code>:</p>
<figure class="illo">
<img src="/assets/img/of.png" />
<figcaption>`of` wraps up something in a container</figcaption>
</figure>
<p>Here’s how we implemented <code class="language-plaintext highlighter-rouge">of</code> for <code class="language-plaintext highlighter-rouge">Maybe</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">Maybe</span><span class="p">.</span><span class="k">of</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">new</span> <span class="nx">Maybe</span><span class="p">.</span><span class="nx">Just</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
<span class="p">};</span>
</code></pre></figure>
<p>And the implementation for Array is trivial:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="k">of</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">[</span><span class="nx">x</span><span class="p">];</span> <span class="p">};</span>
</code></pre></figure>
<p>Please read <a href="/code/2014/08/12/applicatives-ramda-style/">my article on Applicatives</a> for a real-world
example of these concepts in action. Gleb Bahmutov has also written a <a href="http://bahmutov.calepin.co/combine-promises-with-maybe-functors.html">good article on using Applicative Functors with Promises</a> that goes more in depth in the code than this article did. And I also should mention the excellent illustrated article <a href="http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html">Functors, Applicatives, And Monads In Pictures</a>, by Aditya Y. Bhargava.</p>
<hr />
<p>Thanks to <a href="http://www.jcphillipps.com/">J. C. Phillipps</a> for the illustrations. No animals were harmed
in the writing of this blog post.</p>
It turns out that JavaScript is not Haskell2014-10-02T00:00:00+00:00/code/2014/10/02/not-haskell
<p>We were pretty excited about one feature of <a href="http://ramdajs.com">Ramda</a> v0.5.0. I even wrote a
<a href="/code/2014/09/14/the-prefix-is-infix">blog post</a> about it.</p>
<p>The problem we thought we were solving was: How do you curry infix operators in prefix form, when
the operation is not commutative? Haskell solves this problem very elegantly. For example,
exponentiation. Haskell uses the caret symbol (<code class="language-plaintext highlighter-rouge">^</code>) for this operation. You can use it infix
as you’d expect:</p>
<figure class="highlight"><pre><code class="language-haskell" data-lang="haskell"> <span class="err">λ</span> <span class="mi">2</span><span class="o">^</span><span class="mi">10</span>
<span class="mi">1024</span>
<span class="o">::</span> <span class="kt">Num</span> <span class="n">a</span> <span class="o">=></span> <span class="n">a</span>
</code></pre></figure>
<p>Converting to prefix and currying is beatiful. If you want a function to calculate e.g. <code class="language-plaintext highlighter-rouge">2^n</code>:</p>
<figure class="highlight"><pre><code class="language-haskell" data-lang="haskell"> <span class="err">λ</span> <span class="p">(</span><span class="mi">2</span><span class="o">^</span><span class="p">)</span>
<span class="o">::</span> <span class="p">(</span><span class="kt">Integral</span> <span class="n">b</span><span class="p">,</span> <span class="kt">Num</span> <span class="n">a</span><span class="p">)</span> <span class="o">=></span> <span class="n">b</span> <span class="o">-></span> <span class="n">a</span>
<span class="err">λ</span> <span class="p">(</span><span class="mi">2</span><span class="o">^</span><span class="p">)</span> <span class="mi">10</span>
<span class="mi">1024</span>
<span class="o">::</span> <span class="kt">Num</span> <span class="n">a</span> <span class="o">=></span> <span class="n">a</span>
</code></pre></figure>
<p>And if you want a function for <code class="language-plaintext highlighter-rouge">n^2</code>:</p>
<figure class="highlight"><pre><code class="language-haskell" data-lang="haskell"> <span class="err">λ</span> <span class="p">(</span><span class="o">^</span><span class="mi">2</span><span class="p">)</span>
<span class="o">::</span> <span class="kt">Num</span> <span class="n">a</span> <span class="o">=></span> <span class="n">a</span> <span class="o">-></span> <span class="n">a</span>
<span class="err">λ</span> <span class="p">(</span><span class="o">^</span><span class="mi">2</span><span class="p">)</span> <span class="mi">10</span>
<span class="mi">100</span>
<span class="o">::</span> <span class="kt">Num</span> <span class="n">a</span> <span class="o">=></span> <span class="n">a</span>
</code></pre></figure>
<p>That’s what we wanted; that’s what we made ourselves believe we were getting. But it turns
out–SPOILER ALERT–Javascript is <em>not</em> Haskell. What we got instead was confusing and inconsistent.
David Chambers, a regular, and very valuable Ramda contributor, observed:</p>
<blockquote>
<p>This is very surprising:</p>
<p><code class="language-plaintext highlighter-rouge">R.divide(10, 2) //=> 5</code></p>
<p><code class="language-plaintext highlighter-rouge">R.divide(10)(2) //=> 0.2</code></p>
</blockquote>
<p>Uh-oh. Then J. A. Forbes pointed out:</p>
<blockquote>
<p>Why is it that flipping twice removes the inconsistency?</p>
<p><code class="language-plaintext highlighter-rouge">R.divide = R.compose(R.flip,R.flip)(R.divide)</code></p>
<p><code class="language-plaintext highlighter-rouge">R.divide(10,2) //=> 5</code></p>
<p><code class="language-plaintext highlighter-rouge">R.divide(10)(2) //=> 5</code></p>
</blockquote>
<p>This cat sums up the process pretty well. Started with so much optimism …</p>
<p><img src="/assets/img/cat-stuck.png" alt="Wow, it is so much better on this side of the fence" /></p>
<p>Clearly, our shiny, new implementation of <code class="language-plaintext highlighter-rouge">op</code>–a way to curry operators in a left-section/right-section
fashion–was not only confusing, but inconsistent. It was holed below the waterline and sinking fast.</p>
<p>So, my apologies. I really thought we had something cool there. But it wound up being a dud.</p>
<p>We have learned from it, however. In the master branch of Ramda now, I have <a href="https://github.com/ramda/ramda/commit/a234239e08fd4b5e4a8f07a459a4dc2586c45925">re-implemented
<code class="language-plaintext highlighter-rouge">op</code></a>
with consistent behavior and semantics, essentially using a “placeholder” approach, e.g:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">divide</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">op</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">a</span> <span class="o">/</span> <span class="nx">b</span><span class="p">;</span> <span class="p">});</span>
<span class="kd">var</span> <span class="nx">half</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">divide</span><span class="p">(</span><span class="nx">__</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// `__` here is some undefined value</span>
<span class="nx">half</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="c1">//=> 50</span>
<span class="kd">var</span> <span class="nx">reciprocal</span> <span class="o">=</span> <span class="nx">divide</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="nx">reciprocal</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="c1">//=> 0.25</span>
</code></pre></figure>
<p>But we may not stop there. This has us thinking we can have a generalized placeholder
approach to currying. Early experiments are promising. I’ll try to keep you posted.</p>
The (pre)fix is in(fix)2014-09-14T00:00:00+00:00/code/2014/09/14/the-prefix-is-infix
<div style="outline: 1px dashed red; padding: 4px;">
<strong>***UPDATE***</strong>
<p>
Turns out this didn't work well! It was both confusing to users and inconsistent in its behavior.
Read the next post <a href="/code/2014/10/02/not-haskell">"It turns out that JavaScript is not Haskell</a>
to see what we're doing about it.</p>
</div>
<p>For <a href="https://github.com/ramda/ramda">Ramda</a> we’ve wrapped several JavaScript
infix operators as functions, i.e. in prefix form. You gotta do that if you want to curry
and compose with those operations. Some of the time, that works out fine. <code class="language-plaintext highlighter-rouge">add</code>, for example,
converts to prefix form with no confusion:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="c1">// 10 + 3</span>
<span class="kd">var</span> <span class="nx">add10</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="nx">add10</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span> <span class="c1">// 13, duh</span>
</code></pre></figure>
<p><code class="language-plaintext highlighter-rouge">add</code> converts to infix easily because it is commutative: <code class="language-plaintext highlighter-rouge">a + b == b + a</code>.
Infix operators that are not commutative convert awkwardly. Consider <code class="language-plaintext highlighter-rouge">divide</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">divide</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1">// 10 / 2</span>
<span class="kd">var</span> <span class="nx">divide10</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">divide</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span> <span class="c1">// uh ... wait a second ...</span>
<span class="nx">divide10</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> <span class="c1">// 5 ... something smells funny ...</span>
</code></pre></figure>
<p>Here the order of arguments matters, and the semantics start to wobble.
<code class="language-plaintext highlighter-rouge">add(10)</code> clearly means “If you give me a number, I will add 10 to it.”
<code class="language-plaintext highlighter-rouge">divide(10)</code> on the other hand, seems to be saying “If you give me a number,
I will divide it by 10.” But that is not what it means. What <code class="language-plaintext highlighter-rouge">divide(10)</code>
means is “if you give me a number, I will <em>divide that number into 10</em>.”</p>
<p>The partially applied version of <code class="language-plaintext highlighter-rouge">divide</code> is also probably not very useful. How often do you
store a number so you can divide it by a bunch of other numbers? I’d guess not
very frequently. It’s typically more useful to curry in the <em>divisor</em> of this
operation, not the <em>dividend</em>.</p>
<p>We noticied this peculiar property of the non-commutative operators converted
to prefix functions pretty early on. It always rankled us, but we didn’t have a good solution for it.
To get around it, we defined functions like <code class="language-plaintext highlighter-rouge">divideBy</code>. <code class="language-plaintext highlighter-rouge">divideBy</code> was a
flipped version of <code class="language-plaintext highlighter-rouge">divide</code>; so when you partially applied <code class="language-plaintext highlighter-rouge">divideBy</code>
it would read more like what the behavior is:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">divideBy</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="c1">// 10 / 2</span>
<span class="kd">var</span> <span class="nx">divideBy2</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">divideBy</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
<span class="nx">divideBy2</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span> <span class="c1">// 5, duh</span>
</code></pre></figure>
<p>… but that always felt like a hack. Why should this <em>one</em> operation take <em>two</em> functions to express?</p>
<p>This behavior was especially obnoxious with curried relational operators, viz.
<code class="language-plaintext highlighter-rouge"><</code>, <code class="language-plaintext highlighter-rouge"><=</code>, <code class="language-plaintext highlighter-rouge">></code>, <code class="language-plaintext highlighter-rouge">>=</code>. (Equality operators are commutative, so those were cool.)</p>
<p>For example, consider <code class="language-plaintext highlighter-rouge"><</code> (less than) converted to the prefix function <code class="language-plaintext highlighter-rouge">lt</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">lt</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="c1">// 2 < 10</span>
<span class="kd">var</span> <span class="nx">lt2</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">lt</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> <span class="c1">// oh no</span>
<span class="nx">lt2</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span> <span class="c1">// true. wtf?</span>
</code></pre></figure>
<p>We couldn’t hack around these by flipping them and giving them separate names, because the flipped
versions have the opposite meaning, e.g. <code class="language-plaintext highlighter-rouge">R.flip(R.lt) == R.gte</code>. The cure is worse than the disease.</p>
<p>Scott posted this problem as a desparate plea on Stack Exchange, and got a
<a href="http://stackoverflow.com/a/25720884/1243641">spectacular answer and solution</a>.
Not surprisingly, the insight comes from Haskell. I recommend you read the response by Aadit M. Shah, it’s
well worth a read. Go ahead, I’ll wait.</p>
<p>The essence of the solution is to treat infix operators differently. Instead of currying them from left to right,
they are curried in the following manner:</p>
<ul>
<li>When given 1 argument, that argument is <em>applied right</em>. So <code class="language-plaintext highlighter-rouge">lt(10)</code> returns a function like <code class="language-plaintext highlighter-rouge">x -> x < 10</code></li>
<li>When given 2 arguments, but the second one is <code class="language-plaintext highlighter-rouge">undefined</code>, then it is <em>applied left</em>, i.e
<code class="language-plaintext highlighter-rouge">lt(10, undefined) :: x -> 10 < x</code>.</li>
<li>When given 2 arguments and both are defined, evaluate the function and return the result.</li>
</ul>
<p>This approach threads the needle of converting from infix to prefix while maintaining (improving) readability.
An added bonus: we can get rid of all the flipped/renamed functions, so the API footprint is a little smaller.
Win-win-win.</p>
<p>This distinction in the way we are treating infix operators is coming up in ramda v0.5.0.
We will also be exposing an <code class="language-plaintext highlighter-rouge">op</code> function on ramda, so you can make your infix-style functions behave this way,
should you so desire.</p>
The Tao of λ: Applicatives, Ramda style2014-08-12T00:00:00+00:00/code/2014/08/12/applicatives-ramda-style
<p>I’ve been working on making <a href="https://github.com/ramda/ramda">Ramda</a> integrate with
<a href="https://github.com/fantasyland/fantasy-land">Fantasy-land</a>-style objects. Specifically, I added the
functions <code class="language-plaintext highlighter-rouge">ap</code> and <code class="language-plaintext highlighter-rouge">of</code> to Ramda. These functions satisfy the <code class="language-plaintext highlighter-rouge">Apply</code> and <code class="language-plaintext highlighter-rouge">Applicative</code>
specifications, respectively.</p>
<p><code class="language-plaintext highlighter-rouge">of</code> is so trivial it appears almost useless. It simply wraps its argument in an array:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="k">of</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">[</span><span class="nx">x</span><span class="p">];</span> <span class="p">};</span>
</code></pre></figure>
<p>(The actual implementation of <code class="language-plaintext highlighter-rouge">of</code> in Ramda checks if you have also passed in a Fantasy-land-style object
with an <code class="language-plaintext highlighter-rouge">of</code> method, and dispatches to that method–but that is beside the point for this discussion.)</p>
<p><code class="language-plaintext highlighter-rouge">ap</code> on the other hand, seems so obscure that at first glance, it’s difficult even to see how you
would use it. In Ramda, <code class="language-plaintext highlighter-rouge">ap</code> takes a list of functions (<code class="language-plaintext highlighter-rouge">fns</code>), and a list of arguments (<code class="language-plaintext highlighter-rouge">args</code>) to
apply the list of functions to. It returns an array of results from applying each function to each
argument. The output of <code class="language-plaintext highlighter-rouge">ap</code> is like a cross-product of the <code class="language-plaintext highlighter-rouge">fns</code> by the <code class="language-plaintext highlighter-rouge">args</code>, with a length of
<code class="language-plaintext highlighter-rouge">fns.length * args.length</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">ap</span><span class="p">([</span><span class="nx">R</span><span class="p">.</span><span class="nx">multiply</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="nx">R</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="mi">3</span><span class="p">)],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]);</span> <span class="c1">// => [2, 4, 6, 4, 5, 6]</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">ap</span><span class="p">([</span><span class="nx">R</span><span class="p">.</span><span class="nx">multiply</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="nx">R</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="nx">R</span><span class="p">.</span><span class="nx">subtractN</span><span class="p">(</span><span class="mi">2</span><span class="p">)],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]);</span>
<span class="c1">// => [2, 4, 6, 4, 5, 6, -1, 0, 1]</span>
</code></pre></figure>
<p>I added these functions to Ramda on faith; that is, even though I did not clearly see real-world use cases
for them, I trusted that these functions are useful. After all, <code class="language-plaintext highlighter-rouge">ap</code> and <code class="language-plaintext highlighter-rouge">of</code> can both be found in
Haskell (<code class="language-plaintext highlighter-rouge">of</code> is called <code class="language-plaintext highlighter-rouge">pure</code> in Haskell). And those Haskell folks are pretty sharp.</p>
<p>Then Thomas Deutsch left a comment on Scott’s blog post
<a href="http://fr.umio.us/favoring-curry/#post-1529816132">Favoring Curry</a>. He was working on a function
<code class="language-plaintext highlighter-rouge">hasAllTags</code> that takes a list of letters and returns <code class="language-plaintext highlighter-rouge">true</code> if the passed in list contains all of
the letters in an array inside the function. In his posted example of <code class="language-plaintext highlighter-rouge">hasAllTags</code>, the internal
list is <code class="language-plaintext highlighter-rouge">['a', 'd']</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">hasAllTags</span><span class="p">([</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">e</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">d</span><span class="dl">'</span><span class="p">]);</span> <span class="c1">// => true</span>
<span class="nx">hasAllTags</span><span class="p">([</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">e</span><span class="dl">'</span><span class="p">]);</span> <span class="c1">// => false</span>
</code></pre></figure>
<p>Mr. Deutsch’s question: “How is it possible to construct this function only by composition or
currying?”</p>
<p>Good question! Let’s take apart what this function is supposed to do:</p>
<ol>
<li>Take a list of letters</li>
<li>For each letter in the internal list (<code class="language-plaintext highlighter-rouge">['a', 'd']</code>), see if the passed in list contains that letter</li>
<li>If all the internal letters are found, return <code class="language-plaintext highlighter-rouge">true</code>, otherwise <code class="language-plaintext highlighter-rouge">false</code></li>
</ol>
<p><span></span></p>
<p>This is very close to <code class="language-plaintext highlighter-rouge">contains</code>. The difference is that we need to apply <code class="language-plaintext highlighter-rouge">contains</code> repeatedly, with different
arguments, viz.:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">contains</span><span class="p">(</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="nx">list</span><span class="p">);</span>
<span class="nx">contains</span><span class="p">(</span><span class="dl">'</span><span class="s1">d</span><span class="dl">'</span><span class="p">,</span> <span class="nx">list</span><span class="p">);</span>
</code></pre></figure>
<p>And somehow we need to <code class="language-plaintext highlighter-rouge">and</code> all of those results together to see if the whole expression is <code class="language-plaintext highlighter-rouge">true</code>.
So we want our composition to:</p>
<ol>
<li>Take a list of letters</li>
<li>pass it to <code class="language-plaintext highlighter-rouge">contains</code> once for each internal letter</li>
<li>evaluate all the results of all the calls to <code class="language-plaintext highlighter-rouge">contains</code></li>
<li>output true or false based on #3</li>
</ol>
<p><span></span></p>
<p>Here we have a real use case for <code class="language-plaintext highlighter-rouge">ap</code>: I can take my input list and apply a list of functions to it!
In this case, I am going to apply a list of <code class="language-plaintext highlighter-rouge">contains</code> partially applied to each letter in the
internal list.
I generate that list of functions by mapping over the internal letters and partially applying each one
into <code class="language-plaintext highlighter-rouge">contains</code>. Ramda’s auto-curried functions makes this easy:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">contains</span><span class="p">,</span> <span class="p">[</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">d</span><span class="dl">'</span><span class="p">])</span>
<span class="c1">//=> returns a list of partially-applied `contains` functions.</span>
</code></pre></figure>
<p>Then I take the list of functions from that mapping, and pass them to <code class="language-plaintext highlighter-rouge">ap</code>. Of course, <code class="language-plaintext highlighter-rouge">ap</code> is
also curried. I am giving just the list of functions to it:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">ap</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">contains</span><span class="p">,</span> <span class="p">[</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">d</span><span class="dl">'</span><span class="p">]))</span> <span class="c1">//=> Function ::[Args] -> [Bools]</span>
</code></pre></figure>
<p>This is the guts of the composition.
Given just the list of functions, <code class="language-plaintext highlighter-rouge">ap</code> returns a function that is waiting for
a list of arguments to apply its list of functions to. And then <code class="language-plaintext highlighter-rouge">ap</code> will return an array of results
of those applications. In this case, it will be an array of booleans.</p>
<p>The final step in the composition is to reduce that output array of booleans from <code class="language-plaintext highlighter-rouge">ap</code> to a single boolean.
Simplest thing to do is to pass the output from <code class="language-plaintext highlighter-rouge">ap</code> to <code class="language-plaintext highlighter-rouge">all</code>,
partially applied to the <code class="language-plaintext highlighter-rouge">Identity</code> function:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">R</span><span class="p">.</span><span class="nx">compose</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">all</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">I</span><span class="p">),</span> <span class="nx">R</span><span class="p">.</span><span class="nx">ap</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">contains</span><span class="p">,</span> <span class="p">[</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">d</span><span class="dl">'</span><span class="p">])))</span>
</code></pre></figure>
<p>All that remains to do is to prepare the original list to be input to this composition.
We can’t just pass a list of letters in. Recall that <code class="language-plaintext highlighter-rouge">ap</code> will apply its array of functions to
each one of its list of arguments. If we passed in the array <code class="language-plaintext highlighter-rouge">['a', 'b', 'c', 'd']</code>, <code class="language-plaintext highlighter-rouge">ap</code>
would call each function four times! Worse than that, we have partially applied <code class="language-plaintext highlighter-rouge">contains</code>
inside <code class="language-plaintext highlighter-rouge">ap</code>, and those functions are expecting an array, not a string.</p>
<p>In other words, we want to pass the input array <em>inside</em> the arguments list to <code class="language-plaintext highlighter-rouge">ap</code>.
The solution is to wrap the input in an array. That is exactly what <code class="language-plaintext highlighter-rouge">of</code> does. So the complete
composition of the <code class="language-plaintext highlighter-rouge">hasAllTags</code> function is:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">hasAllTags</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">compose</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">all</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">I</span><span class="p">),</span> <span class="nx">R</span><span class="p">.</span><span class="nx">ap</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">contains</span><span class="p">,</span> <span class="p">[</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">d</span><span class="dl">'</span><span class="p">])),</span> <span class="nx">R</span><span class="p">.</span><span class="k">of</span><span class="p">);</span>
<span class="nx">hasAllTags</span><span class="p">([</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">e</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">d</span><span class="dl">'</span><span class="p">])</span> <span class="c1">// => true</span>
<span class="nx">hasAllTags</span><span class="p">([</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">e</span><span class="dl">'</span><span class="p">])</span> <span class="c1">// => false</span>
</code></pre></figure>
<p>Hey, those Haskell folks <em>are</em> pretty sharp!</p>
<p>You can find <code class="language-plaintext highlighter-rouge">ap</code> and <code class="language-plaintext highlighter-rouge">of</code> and many more
fun functions in <a href="https://www.npmjs.org/package/ramda">Ramda 0.3.0</a>. Please take it for a spin.</p>
Haiku Review: Learn You a Haskell For Great Good2014-08-10T00:00:00+00:00/code/2014/08/10/haiku-review-learn-you-a-haskell-for-great-good
<p>Pure and elegant <br />
See the beautiful patterns… <br />
Monads? WTF?</p>
Constraint notation revisited2014-07-18T00:00:00+00:00/code/2014/07/18/constraint-notation-revisited
<p>A little while ago I wrote a <a href="/code/2014/02/14/constraint-notation/">post about a <code class="language-plaintext highlighter-rouge">where</code> function</a>
I was adding to <a href="https://github.com/ramda/ramda">Ramda</a>. The function takes two objects, a spec
and a test object, and returns <code class="language-plaintext highlighter-rouge">true</code> if the test object satisfies the spec. Since <code class="language-plaintext highlighter-rouge">where</code> is curried,
it is great for generating predicates; and in context, e.g. with a <code class="language-plaintext highlighter-rouge">find</code> or <code class="language-plaintext highlighter-rouge">filter</code>, it produces
code that <em>reads well</em>. Here’s a toy example to illustrate what I mean:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">isDivBy3</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">x</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">===</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">where</span><span class="p">({</span><span class="na">x</span><span class="p">:</span> <span class="nx">isDivBy3</span><span class="p">}),</span> <span class="nx">listOfObjects</span><span class="p">);</span>
</code></pre></figure>
<p>The Ramda <code class="language-plaintext highlighter-rouge">where</code> function was inspired by Lodash’s object constraint notation (e.g., <code class="language-plaintext highlighter-rouge">_.find({x: 10})</code>), but
the two functions are not the same. Lodash’s does some things Ramda’s doesn’t, and Ramda’s does some
things Lodash’s doesn’t.</p>
<p>I used <code class="language-plaintext highlighter-rouge">where</code> in my examples when I <a href="/code/2014/05/16/introducing-ramda/">introduced Ramda</a>, and Scott
also used <code class="language-plaintext highlighter-rouge">where</code> in his examples in <a href="http://fr.umio.us/why-ramda/">Why Ramda?</a> Then we got
a bit of a shock. John-David Dalton (of Lodash fame) pointed out that Ramda <code class="language-plaintext highlighter-rouge">where</code> was
<a href="http://jsperf.com/lodash-vs-ramda">dog slow</a>
(<strong>Caution:</strong> The graphs at this link are <em>fuuuuuuugly</em>).</p>
<p>The good news is that we were able, after much struggle, to achieve
<a href="http://jsperf.com/lodash-vs-ramda/7">parity with Lodash’s performance</a>. This warrants a major hat-tip to
Dalton for the heads up, and again to Dalton and Mathias Bynens for
<a href="http://benchmarkjs.com/">Benchmark.js</a> and <a href="http://jsperf.com">jsperf.com</a> which made these improvements possible.</p>
<p>Now for the bad news. We had to turn the implementation of <code class="language-plaintext highlighter-rouge">where</code> from this artful, compact code (if I do say so myself):</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">where</span> <span class="o">=</span> <span class="nx">curry</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">spec</span><span class="p">,</span> <span class="nx">test</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">all</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="nx">spec</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
<span class="k">return</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">val</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">function</span><span class="dl">'</span><span class="p">)</span> <span class="p">?</span>
<span class="nx">val</span><span class="p">(</span><span class="nx">test</span><span class="p">[</span><span class="nx">key</span><span class="p">],</span> <span class="nx">test</span><span class="p">)</span> <span class="p">:</span>
<span class="p">(</span><span class="nx">test</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">===</span> <span class="nx">val</span><span class="p">);</span>
<span class="p">},</span> <span class="nx">keys</span><span class="p">(</span><span class="nx">spec</span><span class="p">));</span>
<span class="p">});</span>
</code></pre></figure>
<p>… to this horrific imperative monstrosity:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">satisfiesSpec</span><span class="p">(</span><span class="nx">spec</span><span class="p">,</span> <span class="nx">parsedSpec</span><span class="p">,</span> <span class="nx">testObj</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">spec</span> <span class="o">===</span> <span class="nx">testObj</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="kc">true</span><span class="p">;</span> <span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">testObj</span> <span class="o">==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> <span class="p">}</span>
<span class="nx">parsedSpec</span><span class="p">.</span><span class="nx">fn</span> <span class="o">=</span> <span class="nx">parsedSpec</span><span class="p">.</span><span class="nx">fn</span> <span class="o">||</span> <span class="p">[];</span>
<span class="nx">parsedSpec</span><span class="p">.</span><span class="nx">obj</span> <span class="o">=</span> <span class="nx">parsedSpec</span><span class="p">.</span><span class="nx">obj</span> <span class="o">||</span> <span class="p">[];</span>
<span class="kd">var</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span><span class="p">,</span> <span class="nx">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nx">fnLen</span> <span class="o">=</span> <span class="nx">parsedSpec</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">length</span><span class="p">,</span>
<span class="nx">j</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nx">objLen</span> <span class="o">=</span> <span class="nx">parsedSpec</span><span class="p">.</span><span class="nx">obj</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="o">++</span><span class="nx">i</span> <span class="o"><</span> <span class="nx">fnLen</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">key</span> <span class="o">=</span> <span class="nx">parsedSpec</span><span class="p">.</span><span class="nx">fn</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
<span class="nx">val</span> <span class="o">=</span> <span class="nx">spec</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">key</span> <span class="k">in</span> <span class="nx">testObj</span><span class="p">))</span> <span class="p">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">val</span><span class="p">(</span><span class="nx">testObj</span><span class="p">[</span><span class="nx">key</span><span class="p">],</span> <span class="nx">testObj</span><span class="p">))</span> <span class="p">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">while</span> <span class="p">(</span><span class="o">++</span><span class="nx">j</span> <span class="o"><</span> <span class="nx">objLen</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">key</span> <span class="o">=</span> <span class="nx">parsedSpec</span><span class="p">.</span><span class="nx">obj</span><span class="p">[</span><span class="nx">j</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">spec</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">!==</span> <span class="nx">testObj</span><span class="p">[</span><span class="nx">key</span><span class="p">])</span> <span class="p">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">where</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">where</span><span class="p">(</span><span class="nx">spec</span><span class="p">,</span> <span class="nx">testObj</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">parsedSpec</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">partition</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">typeof</span> <span class="nx">spec</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">function</span><span class="dl">"</span> <span class="p">?</span> <span class="dl">"</span><span class="s2">fn</span><span class="dl">"</span> <span class="p">:</span> <span class="dl">"</span><span class="s2">obj</span><span class="dl">"</span><span class="p">;</span>
<span class="p">},</span> <span class="nx">keys</span><span class="p">(</span><span class="nx">spec</span><span class="p">));</span>
<span class="k">switch</span> <span class="p">(</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="mi">0</span><span class="p">:</span> <span class="k">throw</span> <span class="nx">NO_ARGS_EXCEPTION</span><span class="p">;</span>
<span class="k">case</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">testObj</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">satisfiesSpec</span><span class="p">(</span><span class="nx">spec</span><span class="p">,</span> <span class="nx">parsedSpec</span><span class="p">,</span> <span class="nx">testObj</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">satisfiesSpec</span><span class="p">(</span><span class="nx">spec</span><span class="p">,</span> <span class="nx">parsedSpec</span><span class="p">,</span> <span class="nx">testObj</span><span class="p">);</span>
<span class="p">};</span>
</code></pre></figure>
<p><strong>Two</strong> <code class="language-plaintext highlighter-rouge">while</code> loops? Ugh. The primary problem with the original <code class="language-plaintext highlighter-rouge">where</code>’s performance was that it was
parsing the <code class="language-plaintext highlighter-rouge">spec</code> on every call. Parsing that object is expensive. The revised, performant version does
the parsing once.</p>
<p>And now, the irony: I started writing Ramda with Scott because I wanted to write Javascript in the elegant, terse
functional style. Now it turns out that to do that I have to write some really inelegant, prolix code.</p>
Introducing Ramda2014-05-16T00:00:00+00:00/code/2014/05/16/introducing-ramda
<p>For the past year plus, my colleague Scott Sauyet and I have been working in our free time on <a href="https://github.com/ramda/ramda">Ramda</a>,
“a practical functional library for Javascript programmers.” When we signed up for Frontend Masters
“Hardcore Functional Programming with Javascript” workshop, we were surprised to learn that they had selected
Ramda to illustrate their examples. With that vote of confidence, we figured it is time to announce the arrival of
Ramda.</p>
<p>There are already some excellent libraries with a functional flavor, such as
<a href="https://github.com/jashkenas/underscore">Underscore</a> and <a href="https://github.com/lodash/lodash">Lodash</a>.
Ramda includes all of the favorite list-manipulation functions you expect, e.g. <code class="language-plaintext highlighter-rouge">map</code>, <code class="language-plaintext highlighter-rouge">filter</code>, <code class="language-plaintext highlighter-rouge">reduce</code>, <code class="language-plaintext highlighter-rouge">find</code>,
etc. But Ramda is significantly different from libraries like Underscore and Lodash. The primary distinguishing features of Ramda are:</p>
<ul>
<li><strong>Ramda takes the function first, and the data last.</strong>
<a href="http://www.youtube.com/watch?v=m3svKOdZijA">Brian Lonsdorf explains why this parameter ordering is a big deal</a>.
In a nutshell, the combination of currying and function-first enables the developer to compose functions with very
little code (often in a “point-free” fashion), before finally passing in the data. So instead of this:</li>
</ul>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// Underscore/Lodash style:</span>
<span class="kd">var</span> <span class="nx">validUsersNamedBuzz</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">users</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">users</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">user</span><span class="p">.</span><span class="nx">name</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">Buzz</span><span class="dl">'</span> <span class="o">&&</span> <span class="nx">_</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">(</span><span class="nx">user</span><span class="p">.</span><span class="nx">errors</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">};</span>
</code></pre></figure>
<p>… you can do this:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// Ramda style:</span>
<span class="kd">var</span> <span class="nx">validUsersNamedBuzz</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">where</span><span class="p">({</span><span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Buzz</span><span class="dl">'</span><span class="p">,</span> <span class="na">errors</span><span class="p">:</span> <span class="nx">R</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">}));</span>
</code></pre></figure>
<ul>
<li><strong>Ramda methods are automatically curried.</strong> While you can curry (or partially apply) functions in Underscore and Lodash, Ramda does it for you. Virtually all methods of 2 or more arguments are curried by default in Ramda. For example:</li>
</ul>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// `prop` takes two arguments. If I just give it one, I get a function back</span>
<span class="kd">var</span> <span class="nx">moo</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="dl">'</span><span class="s1">moo</span><span class="dl">'</span><span class="p">);</span>
<span class="c1">// when I call that function with one argument, I get the result.</span>
<span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">moo</span><span class="p">({</span><span class="na">moo</span><span class="p">:</span> <span class="dl">'</span><span class="s1">cow</span><span class="dl">'</span><span class="p">});</span> <span class="c1">// => 'cow' </span>
</code></pre></figure>
<p>This auto-currying makes it easy to <em>compose</em> functions to create new functions. Because the API
is function-first, data-last, you can continue composing and composing until you build up the
function you need before dropping in the data. (Hugh Jackson published <a href="http://hughfdjackson.com/javascript/why-curry-helps/">an excellent article</a>
describing the advantages of this style.)</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// take an object with an `amount` property</span>
<span class="c1">// add one to it</span>
<span class="c1">// find its remainder when divided by 7</span>
<span class="kd">var</span> <span class="nx">amtAdd1Mod7</span> <span class="o">=</span> <span class="nx">R</span><span class="p">.</span><span class="nx">compose</span><span class="p">(</span><span class="nx">R</span><span class="p">.</span><span class="nx">moduloBy</span><span class="p">(</span><span class="mi">7</span><span class="p">),</span> <span class="nx">R</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="nx">R</span><span class="p">.</span><span class="nx">prop</span><span class="p">(</span><span class="dl">'</span><span class="s1">amount</span><span class="dl">'</span><span class="p">));</span>
<span class="c1">// we can use that as is:</span>
<span class="nx">amtAdd1Mod7</span><span class="p">({</span><span class="na">amount</span><span class="p">:</span> <span class="mi">17</span><span class="p">});</span> <span class="c1">// => 4</span>
<span class="nx">amtAdd1Mod7</span><span class="p">({</span><span class="na">amount</span><span class="p">:</span> <span class="mi">987</span><span class="p">});</span> <span class="c1">// => 1</span>
<span class="nx">amtAdd1Mod7</span><span class="p">({</span><span class="na">amount</span><span class="p">:</span> <span class="mi">68</span><span class="p">});</span> <span class="c1">// => 6</span>
<span class="c1">// etc. </span>
<span class="c1">// But we can also use our composed function on a list of objects, e.g. to `map`:</span>
<span class="kd">var</span> <span class="nx">amountObjects</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="na">amount</span><span class="p">:</span> <span class="mi">903</span><span class="p">},</span> <span class="p">{</span><span class="na">amount</span><span class="p">:</span> <span class="mi">2875654</span><span class="p">},</span> <span class="p">{</span><span class="na">amount</span><span class="p">:</span> <span class="mi">6</span><span class="p">}</span>
<span class="p">]</span>
<span class="nx">R</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">amtAdd1Mod7</span><span class="p">,</span> <span class="nx">amountObjects</span><span class="p">);</span> <span class="c1">// => [1, 6, 0]</span>
<span class="c1">// of course, `map` is also curried, so you can generate a new function </span>
<span class="c1">// using `amtAdd1Mod7` that will wait for a list of "amountObjects" to </span>
<span class="c1">// get passed in:</span>
<span class="kd">var</span> <span class="nx">amountsToValue</span> <span class="o">=</span> <span class="nx">map</span><span class="p">(</span><span class="nx">amtAdd1Mod7</span><span class="p">);</span>
<span class="nx">amountsToValue</span><span class="p">(</span><span class="nx">amountObjects</span><span class="p">);</span> <span class="c1">// => [1, 6, 0]</span>
</code></pre></figure>
<p><a href="https://www.npmjs.org/package/ramda">Ramda is available on npm</a>, so please take it for a spin.
And <a href="https://github.com/CrossEye/ramda/issues">please let us know</a>
what you think, and how the library can be improved.</p>
Make Your AngularJS Directive Wait for the DOM2014-03-20T00:00:00+00:00/2014/03/20/directive-after-dom
<p>Sometimes you want your AngularJS directive to execute <em>after</em> the affected
element has been added to the DOM and had its styles computed.
This can often be solved by putting your DOM-specific logic inside a <code class="language-plaintext highlighter-rouge">$timeout</code>
and executing it on the next tick. But the <code class="language-plaintext highlighter-rouge">$timeout</code> trick does not
guarantee that the element will be ready to manipulate.</p>
<p>I was working with a directive that needed to access the element’s computed
width property, using the <code class="language-plaintext highlighter-rouge">$window.getComputedStyle</code> method. If the directive
fires before the styles are computed, it simply returns “auto” for the width
value.</p>
<p>I needed to get some numeric value back (e.g. “421px”); “auto” is not a useful response:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="p">.</span><span class="nx">directive</span><span class="p">(</span><span class="dl">'</span><span class="s1">example</span><span class="dl">'</span><span class="p">,</span> <span class="p">[</span><span class="dl">'</span><span class="s1">$window</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$window</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">{</span>
<span class="na">restrict</span><span class="p">:</span> <span class="dl">'</span><span class="s1">A</span><span class="dl">'</span><span class="p">,</span>
<span class="na">link</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">element</span><span class="p">,</span> <span class="nx">attrs</span><span class="p">){</span>
<span class="kd">var</span> <span class="nx">width</span> <span class="o">=</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">$window</span><span class="p">.</span><span class="nx">getComputedStyle</span><span class="p">(</span><span class="nx">element</span><span class="p">[</span><span class="mi">0</span><span class="p">]).</span><span class="nx">width</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
<span class="c1">// Uh-oh, the element is not on the DOM yet. `getComputedStyle` </span>
<span class="c1">// returns "auto", so `parseInt` evaluates to NaN, and my </span>
<span class="c1">// calculations are borked</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">}]);</span>
</code></pre></figure>
<p>In this scenario, wrapping this up in a <code class="language-plaintext highlighter-rouge">$timeout</code> was insufficient to solve the problem.
<code class="language-plaintext highlighter-rouge">getComputedStyle</code> was still returning “auto”, even when I tried passing fudge-factor
milliseconds to <code class="language-plaintext highlighter-rouge">$timeout</code>. Up to 200ms was still not guaranteed to return the pixel value I
needed.</p>
<p>The solution was to use the magic of recursion:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript">
<span class="c1">// ...</span>
<span class="nx">link</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">element</span><span class="p">,</span> <span class="nx">attrs</span><span class="p">){</span>
<span class="kd">function</span> <span class="nx">doDomStuff</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">$timeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">width</span> <span class="o">=</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">$window</span><span class="p">.</span><span class="nx">getComputedStyle</span><span class="p">(</span><span class="nx">element</span><span class="p">[</span><span class="mi">0</span><span class="p">]).</span><span class="nx">width</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">width</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// if width is computed, the element is ready to be manipulated</span>
<span class="c1">// so manipulate the element here, e.g.:</span>
<span class="nx">element</span><span class="p">.</span><span class="nx">css</span><span class="p">({</span> <span class="na">backgroundPositionX</span><span class="p">:</span> <span class="nx">width</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">px</span><span class="dl">"</span> <span class="p">});</span>
<span class="c1">// ... and more directive logic ...</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="c1">// otherwise, the element is not ready, so wait a bit and try again:</span>
<span class="nx">doDomStuff</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">},</span> <span class="mi">100</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">doDomStuff</span><span class="p">();</span>
<span class="p">}</span>
<span class="c1">// ...</span>
</code></pre></figure>
<p>That’s not bad, but we can do better:</p>
<ul>
<li>Backstop the recursion with a limited number of tries.</li>
<li>Make the timeout milliseconds and number of tries configurable.</li>
</ul>
<p>Taking those two requirements into account, the directive’s <code class="language-plaintext highlighter-rouge">link</code> function winds up
looking something like this:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript">
<span class="c1">// ...</span>
<span class="nx">link</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">element</span><span class="p">,</span> <span class="nx">attrs</span><span class="p">){</span>
<span class="kd">function</span> <span class="nx">doDomStuff</span><span class="p">(</span><span class="nx">tries</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// a sanity check, just in case we reuse this function as a handler, </span>
<span class="c1">// e.g. for `orientationchange`</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isNaN</span><span class="p">(</span><span class="o">+</span><span class="nx">tries</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">tries</span> <span class="o">=</span> <span class="nx">attrs</span><span class="p">.</span><span class="nx">maxTries</span> <span class="o">||</span> <span class="mi">10</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">tries</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">$timeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">width</span> <span class="o">=</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">$window</span><span class="p">.</span><span class="nx">getComputedStyle</span><span class="p">(</span><span class="nx">element</span><span class="p">[</span><span class="mi">0</span><span class="p">]).</span><span class="nx">width</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">width</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// if width is computed, the element is ready to be manipulated</span>
<span class="c1">// so manipulate the element here, e.g.:</span>
<span class="nx">element</span><span class="p">.</span><span class="nx">css</span><span class="p">({</span> <span class="na">backgroundPositionX</span><span class="p">:</span> <span class="nx">width</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">px</span><span class="dl">"</span> <span class="p">});</span>
<span class="c1">// ...</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="c1">// otherwise, the element is not ready, so decrement the tries, </span>
<span class="c1">// wait a bit, and try again:</span>
<span class="nx">doDomStuff</span><span class="p">(</span><span class="nx">tries</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">},</span> <span class="nx">attrs</span><span class="p">.</span><span class="nx">msDelay</span> <span class="o">||</span> <span class="mi">100</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="c1">// if we got here, we've exhausted our tries, so we probably</span>
<span class="c1">// want to log or warn or throw here.</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nx">doDomStuff</span><span class="p">(</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">maxTries</span><span class="p">);</span>
<span class="c1">// maybe you need to do this too:</span>
<span class="nx">$window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">orientationchange</span><span class="dl">'</span><span class="p">,</span> <span class="nx">doDomStuff</span><span class="p">);</span>
<span class="c1">// ... etc.</span>
<span class="p">}</span>
<span class="c1">// ...</span>
</code></pre></figure>
<p><em>Et voilá</em>—this directive will now delay running until the element’s computed
styles are available, or die trying.</p>
IndexedDB2014-03-13T00:00:00+00:00/code/2014/03/13/indexeddb
<p>I’ve been given an opportunity to do a little freelance writing for
<a href="http://www.programmableweb.com">ProgrammableWeb.com</a>. My first article
is online now. It’s an overview of the API of the new HTML5 IndexedDB spec.</p>
<p><a href="http://blog.programmableweb.com/2014/01/14/take-a-walk-on-the-client-side/">Read my IndexedDB article at ProgrammableWeb</a>.</p>
AngularJS $http.post unexpected promises2014-03-07T00:00:00+00:00/code/2014/03/07/http-post-unexpected-promises
<p>Me, today: “Why am I getting two different objects back from an <code class="language-plaintext highlighter-rouge">$http.post</code>
service call?”</p>
<p>This is a tale of unexpected promises. There were two functions calling two
methods on the backend service using an <code class="language-plaintext highlighter-rouge">$http.post</code> call. The client-side
handlers were written by two different developers. Because the handlers should
have been working with the same kind of object, I saw an opportunity for some
code reuse. But somehow, the handlers were getting different objects.</p>
<p>Both backend service methods return the same kind of object, something like
this:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// Handler A gets passed this as its first argument:</span>
<span class="p">{</span>
<span class="nl">status</span><span class="p">:</span> <span class="p">{</span>
<span class="c1">// ...</span>
<span class="p">}</span>
<span class="nl">payload</span><span class="p">:</span> <span class="p">{</span>
<span class="c1">// ...</span>
<span class="p">}</span>
<span class="p">};</span>
</code></pre></figure>
<p>Handler A received an object just like the one described above. But Handler B
got the expected object wrapped inside another object, like this:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// Handler B gets passed this as its first argument:</span>
<span class="p">{</span>
<span class="nl">data</span><span class="p">:</span> <span class="p">{</span> <span class="c1">// This is the object I expected</span>
<span class="na">status</span><span class="p">:</span> <span class="p">{</span>
<span class="c1">// ...</span>
<span class="p">},</span>
<span class="na">payload</span><span class="p">:</span> <span class="p">{</span>
<span class="c1">// ...</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="nx">headers</span><span class="p">:</span> <span class="p">{</span>
<span class="c1">// ...</span>
<span class="p">},</span>
<span class="nx">status</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
<span class="nx">config</span><span class="p">:</span> <span class="p">{</span>
<span class="c1">// ...</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></figure>
<p>Both handlers were chained to <code class="language-plaintext highlighter-rouge">$http.post</code> calls. Why were they getting
different objects?</p>
<p>It turns out that <code class="language-plaintext highlighter-rouge">$http.post</code> can return promises with different interfaces,
depending on how you attach your handlers to the promise.</p>
<p>The <code class="language-plaintext highlighter-rouge">$http.post</code> method returns a <a href="https://github.com/kriskowal/q">Q</a>-style
promise. (It’s instructive to look at the
<a href="https://github.com/angular/angular.js/blob/master/src/ng/q.js">Angular q.js source code</a>.)
That promise only has the properties <code class="language-plaintext highlighter-rouge">then</code>, <code class="language-plaintext highlighter-rouge">catch</code>, and <code class="language-plaintext highlighter-rouge">finally</code>.
Angular’s <code class="language-plaintext highlighter-rouge">$http</code> service decorates that promise with two additional properties:
<code class="language-plaintext highlighter-rouge">success</code> and <code class="language-plaintext highlighter-rouge">error</code>. These two extra properties unpack the full response
object into its components, and take a function like:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// note the mapping from params to `then` object properties</span>
<span class="nx">$http</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">url</span><span class="p">).</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">headers</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="cm">/* etc. */</span>
<span class="p">});</span>
</code></pre></figure>
<p>Handler A was relying on these extra <code class="language-plaintext highlighter-rouge">success</code> and <code class="language-plaintext highlighter-rouge">error</code> methods, and got the
expected object in the first parameter.</p>
<p>Handler B attached a <code class="language-plaintext highlighter-rouge">then</code> to the <code class="language-plaintext highlighter-rouge">$http()</code> call, and got the full <code class="language-plaintext highlighter-rouge">$http</code>
response object instead. The expected object comes attached to the response
object’s <code class="language-plaintext highlighter-rouge">data</code> property. Worse, the promise returned from <code class="language-plaintext highlighter-rouge">then</code> on <code class="language-plaintext highlighter-rouge">$http</code>
<em>does not have <code class="language-plaintext highlighter-rouge">success</code> and <code class="language-plaintext highlighter-rouge">error</code> properties.</em> So anyone trying to add
their own <code class="language-plaintext highlighter-rouge">success</code> or <code class="language-plaintext highlighter-rouge">error</code> handler to the chain will discover they don’t work.</p>
<p>I rewrote Handler B to use <code class="language-plaintext highlighter-rouge">success</code> instead of <code class="language-plaintext highlighter-rouge">then</code> <em>et voila</em>: Handler B
started getting the expected object, I could reuse handler code, and
everything was copasetic.</p>
Constraint notation in Javascript2014-02-14T00:00:00+00:00/code/2014/02/14/constraint-notation
<blockquote>
<p>Instead of imagining that our main task is to instruct a computer what to do,
let us concentrate rather on explaining to human beings
what we want a computer to do.</p>
<p>– Donald Knuth</p>
</blockquote>
<p>One of the things I really like about working with <a href="http://lodash.com/">Lo-Dash</a> is its object
constraint notation. For example, suppose I want to find an item in a list
where <code class="language-plaintext highlighter-rouge">x === 10</code>. Lo-Dash lets me express that like this:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">xIs10</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">list</span><span class="p">,</span> <span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="mi">10</span><span class="p">});</span>
</code></pre></figure>
<p>I find this syntax easy to write, and at least as important, easy to read.
The intent is perfectly clear.</p>
<p>Naturally, I wanted to incorporate this elegant syntax into <a href="https://github.com/ramda/ramda">Ramda</a>.
But this would not be an easy fit. Ramda is significantly different from Lo-Dash.
Since Ramda emphasizes function composition, the biggest obstacle to integrating the
object constraint syntax is that Ramda methods always take the function <em>first</em> and
the list <em>last</em>.</p>
<p>I pitched the idea to my co-author, Scott. We didn’t want to rewrite Ramda to
type-check the arguments. So we found solution that preserves the composability
of Ramda functions, while gaining the readable, expressive object syntax. And
then we took it a little bit further….</p>
<p>Here is what the API looks like:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">xIs10</span> <span class="o">=</span> <span class="nx">find</span><span class="p">(</span><span class="nx">where</span><span class="p">({</span><span class="na">x</span><span class="p">:</span> <span class="mi">10</span><span class="p">}),</span> <span class="nx">list</span><span class="p">);</span>
</code></pre></figure>
<p><code class="language-plaintext highlighter-rouge">where</code> takes a spec object and a test object and returns <code class="language-plaintext highlighter-rouge">true</code> if the test
satisfies the spec (<code class="language-plaintext highlighter-rouge">false</code> otherwise, of course). Since Ramda automatically
curries its methods, when called with one argument (the spec) as in the
example above, <code class="language-plaintext highlighter-rouge">where</code> returns a function that takes a test object. This makes
it a good helper for generating predicates for methods like <code class="language-plaintext highlighter-rouge">find</code> and <code class="language-plaintext highlighter-rouge">filter</code>.</p>
<p>This would be a fine place to stop, and we could be satisfied with a nice
object-to-predicate method. But this <code class="language-plaintext highlighter-rouge">where</code> can only express <em>equality
relations</em>. If we want to match objects where <code class="language-plaintext highlighter-rouge">x > 10</code>, or more complex
queries, such as <code class="language-plaintext highlighter-rouge">x > 2 AND y > (x * 2) AND y % 2 === 0</code>, then we would have
to write a function.</p>
<p>So we opted to take the object constraint notation one step further: If a
property on the spec object maps to a function, we use that function as the
constraint on that property. Here’s how the examples above would look:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// example 1: find objects where x > 10</span>
<span class="kd">var</span> <span class="nx">xGt10</span> <span class="o">=</span> <span class="nx">filter</span><span class="p">(</span><span class="nx">where</span><span class="p">({</span><span class="na">x</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">x</span> <span class="o">></span> <span class="mi">10</span><span class="p">;</span> <span class="p">}}),</span> <span class="nx">list</span><span class="p">);</span>
<span class="c1">// example 2: find objects where x > 2 && y > x*2 && y is even</span>
<span class="kd">var</span> <span class="nx">xGt2etc</span> <span class="o">=</span> <span class="nx">find</span><span class="p">(</span><span class="nx">where</span><span class="p">({</span>
<span class="na">x</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">obj</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">x</span> <span class="o">></span> <span class="mi">10</span><span class="p">;</span> <span class="p">},</span>
<span class="na">y</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">y</span><span class="p">,</span> <span class="nx">obj</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">y</span> <span class="o">></span> <span class="nx">obj</span><span class="p">.</span><span class="nx">x</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">&&</span> <span class="nx">y</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}),</span> <span class="nx">list</span><span class="p">);</span>
</code></pre></figure>
<p>This is not as immediately readable as the straight equality object syntax. But
I like specifying the constraints property-by-property and having the ability
to express more complex relations than just equality. And we still have the
object notation for plain equality relations.</p>
<p>If you’re curious, here is how <code class="language-plaintext highlighter-rouge">where</code> is implemented in Ramda:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">where</span> <span class="o">=</span> <span class="nx">curry</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">spec</span><span class="p">,</span> <span class="nx">test</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">all</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="nx">spec</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
<span class="k">return</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">val</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">function</span><span class="dl">'</span><span class="p">)</span> <span class="p">?</span>
<span class="nx">val</span><span class="p">(</span><span class="nx">test</span><span class="p">[</span><span class="nx">key</span><span class="p">],</span> <span class="nx">test</span><span class="p">)</span> <span class="p">:</span>
<span class="p">(</span><span class="nx">test</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">===</span> <span class="nx">spec</span><span class="p">[</span><span class="nx">key</span><span class="p">]);</span>
<span class="p">},</span> <span class="nx">keys</span><span class="p">(</span><span class="nx">spec</span><span class="p">));</span>
<span class="p">});</span>
</code></pre></figure>
KingHunt2013-11-28T00:00:00+00:00/code/2013/11/28/kinghunt
<blockquote>
<p>Uneasy lies the head that wears a crown.</p>
<p>– Shakespeare, <em>Henry IV Part II</em></p>
</blockquote>
<p>I wanted to write an app for FirefoxOS.</p>
<ul>
<li>It would help me sharpen my mobile development skills;</li>
<li>I could learn more about AngularJS;</li>
<li>I own a Firefox phone, and wanted to learn its API.</li>
</ul>
<p>I decided to write a chess puzzle app. The parts were all out there already. <a href="https://github.com/jhlywa/chess.js">Chess.js</a> enforces legal moves, and detects check, checkmate, and draw. <a href="http://chessboardjs.com/">ChessboardJS</a> provides the UI: the pieces, the board, the drag-n-drop. I found a large collection of puzzles at <a href="http://www.yacpdb.org/">Yet Another Chess Problem Database</a>. I contacted Dmitri Turevski at the site and confirmed that I could use the problems in my app, and he very graciously agreed. Dmitri also mentioned I should include the problem’s author with the problem, and I followed that advice.</p>
<p>So with all the pieces lined up, the problem was mostly a matter of wiring everything together. Here is what the app does:</p>
<ul>
<li>Loads a default “book” of about 200 problems.</li>
<li>You move the pieces for both sides looking for a solution to the problem in the stipulated number of moves.</li>
<li>When you are satisfied that you have solved the problem, then you can mark the problem solved. The app stores the problems you have solved so that you may filter them out when browsing the list, or moving from one problem to the next.</li>
<li>You can undo moves, or reload the original position. You can also navigate to the next or previous problem.</li>
<li>The app does not require network access, it works entirely offline.</li>
</ul>
<p>What the app doesn’t do (yet):</p>
<ul>
<li>There is no AI, so you gotta find the best moves for both sides. I think this is reasonable for this type of problem which is training you to explore lines from both sides point of view. On the other hand, I may add an AI mode to try and find the defender’s optimal line in future.</li>
<li>You can’t load other books of problems. I really want to add this feature. The book is just a JSON file, so it should be straightforward to integrate that. But I haven’t had time to look into it yet.</li>
<li>I would also like the ability to use more problem types than just “mate in N” problems, e.g., general tactical studies, endgames, etc.</li>
</ul>
<p>Despite the “work in progress” state that the app is in, I submitted it to the Firefox Marketplace. I found out a few days ago that my application <a href="https://marketplace.firefox.com/search?q=kinghunt">KingHunt</a> was accepted. Although it says it’s just for FirefoxOS, it should work in any modern browser. But I have only <em>tested</em> it in FirefoxOS.</p>
<p>You can check out the source code at the <a href="https://github.com/buzzdecafe/kinghunt">KingHunt GitHub repository</a>.</p>
AngularJS, RequireJS, AlmondJS, and Google Maps2013-11-15T00:00:00+00:00/code/2013/11/15/angularjs-and-google-maps
<p>I had to solve the problem of integrating AngularJS and RequireJS with Google Maps. This is not usually a huge challenge, there is even an <a href="https://github.com/millermedeiros/requirejs-plugins">async module for RequireJS</a>, and an <a href="https://github.com/angular-ui/ui-map">Angular-UI map plugin</a> to make integration pretty seamless. The wrinkle that made this integration trickier is <a href="https://github.com/jrburke/almond">AlmondJS</a>—and Almond doesn’t support asynchronous module loading.</p>
<p>When you include the Google Maps script, you can <a href="https://developers.google.com/maps/documentation/javascript/examples/map-simple-async">specify a callback</a> in the querystring that will fire when the Google Maps API is loaded. You could then bootstrap your Angular app in that callback, e.g.:</p>
<figure class="highlight"><pre><code class="language-html" data-lang="html"> <span class="nt"><script></span>
<span class="kd">function</span> <span class="nx">mapReady</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">angular</span><span class="p">.</span><span class="nx">bootstrap</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">gmap</span><span class="dl">"</span><span class="p">),</span> <span class="p">[</span><span class="dl">'</span><span class="s1">app.ui-map</span><span class="dl">'</span><span class="p">]);</span>
<span class="p">}</span>
<span class="nt"></script></span>
<span class="c"><!-- funky formatting to fit the whole url on the screen --></span>
<span class="nt"><script
</span><span class="na">src=</span><span class="s">"https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=mapReady"</span><span class="nt">></span>
<span class="nt"></script></span>
</code></pre></figure>
<p>This will work, but it will block your app until you hear back from Google Maps. I didn’t want to do that; there was only one spot where a user <em>might</em> use the map. Therefore, I wanted to lazily load it.</p>
<p>When you are configuring the <code class="language-plaintext highlighter-rouge">$routeProvider</code>, you can specify an object for the <code class="language-plaintext highlighter-rouge">route</code> parameter’s <code class="language-plaintext highlighter-rouge">resolve</code> property. Each property on the <code class="language-plaintext highlighter-rouge">resolve</code> object is a function that can return a promise. The controller will not get instantiated until the promise is resolved. And when the promise <em>is</em> resolved, the value returned from the promise resolution gets passed into the controller as a parameter.</p>
<p>So the plan of action was to resolve a promise when Google Maps was ready.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="c1">// ...</span>
<span class="nx">$routeProvider</span><span class="p">.</span><span class="nx">when</span><span class="p">({</span>
<span class="na">path</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/path/to/where/ever</span><span class="dl">'</span><span class="p">,</span>
<span class="na">controller</span><span class="p">:</span> <span class="dl">'</span><span class="s1">SomeCtrl</span><span class="dl">'</span><span class="p">,</span>
<span class="na">route</span><span class="p">:</span> <span class="p">{</span>
<span class="na">resolve</span><span class="p">:</span> <span class="p">{</span>
<span class="na">gmap</span><span class="p">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">dfd</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
<span class="c1">// load google maps</span>
<span class="c1">// fire callback</span>
<span class="c1">// resolve promise</span>
<span class="k">return</span> <span class="nx">dfd</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="c1">//...</span>
</code></pre></figure>
<p>Here’s more-or-less how I implemented the <code class="language-plaintext highlighter-rouge">gmap</code> function.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">gmap</span><span class="p">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">dfd</span> <span class="o">=</span> <span class="nx">$q</span><span class="p">.</span><span class="nx">defer</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">doc</span> <span class="o">=</span> <span class="nx">$window</span><span class="p">.</span><span class="nb">document</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">scriptId</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">gmapScript</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">scriptTag</span> <span class="o">=</span> <span class="nx">doc</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="nx">scriptId</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">scriptTag</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// if `scriptTag` exists, then gmaps must be available, so...</span>
<span class="nx">dfd</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// load google maps</span>
<span class="nx">scriptTag</span> <span class="o">=</span> <span class="nx">doc</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">'</span><span class="s1">script</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">scriptTag</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="nx">scriptId</span><span class="p">;</span>
<span class="nx">scriptTag</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">src</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=mapReady</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">doc</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">scriptTag</span><span class="p">);</span>
<span class="c1">// fire callback, specified in the callback attribute of the script tag's src </span>
<span class="c1">// attribute.</span>
<span class="c1">// The callback has to be in global (window) scope, so that Google Maps can find</span>
<span class="c1">// it. I used a closure to store a reference to the deferred object we will </span>
<span class="c1">// resolve when the callback is fired.</span>
<span class="nx">$window</span><span class="p">.</span><span class="nx">mapReady</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">dfd</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// resolve the promise:</span>
<span class="nx">dfd</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="c1">// cleanup the global space now that we are done:</span>
<span class="k">delete</span> <span class="nx">$window</span><span class="p">.</span><span class="nx">mapReady</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">}(</span><span class="nx">dfd</span><span class="p">));</span>
<span class="k">return</span> <span class="nx">dfd</span><span class="p">.</span><span class="nx">promise</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></figure>
<p>With this approach, we don’t risk blocking the entire app; just this one route might block. Of course, this example just shows how to handle the “happy path”; it doesn’t handle if the Maps API fails to load for some reason. I also wound up extending it to return the current positions coordinates, instead of just <code class="language-plaintext highlighter-rouge">true</code> when the maps API is ready. That is left as an exercise for the reader …</p>
The Tao of λ: Undoing with higher-order functions and closures2013-10-09T00:00:00+00:00/code/2013/10/09/the-tao-of-lambda-undoing-with-higher-order-functions-and-closures
<p>Sometimes you need to temporarily change the value of an object property. Maybe you need to stub something for a test; or maybe you need to revert to the prior value for that property. You can do this imperatively, of course, and that is fine. But I want a more generic solution.</p>
<p>I want a function that I pass an object, the property to override, and the new value for the property, and have it return me an <code class="language-plaintext highlighter-rouge">undo</code> function to restore the object’s prior state:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">undo</span> <span class="o">=</span> <span class="nx">revalue</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="nx">newValue</span><span class="p">);</span>
<span class="c1">// do whatever</span>
<span class="nx">undo</span><span class="p">();</span>
<span class="c1">// hey, my original obj is back!</span>
</code></pre></figure>
<p>Here’s a first try that stores the original value in the closure of the returned <code class="language-plaintext highlighter-rouge">undo</code> function:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">revalue</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="nx">newValue</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">undo</span><span class="p">,</span> <span class="nx">orig</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">newValue</span><span class="p">;</span>
<span class="nx">undo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">orig</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">orig</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">return</span> <span class="nx">undo</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></figure>
<p>That pretty much does the trick. Then a colleague asked: “If the value is a function, why not add a <code class="language-plaintext highlighter-rouge">restore</code> property to it?” OK, it’s a bit redundant, since we are returning the <code class="language-plaintext highlighter-rouge">undo</code> function anyways, but WTH.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">revalue</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="nx">newValue</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">undo</span><span class="p">,</span> <span class="nx">orig</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">],</span> <span class="nx">isFn</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">newValue</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">function</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">isFn</span> <span class="p">?</span>
<span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">newValue</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="p">}</span> <span class="p">:</span>
<span class="nx">newValue</span><span class="p">;</span>
<span class="nx">undo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">orig</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">orig</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">isFn</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">].</span><span class="nx">restore</span> <span class="o">=</span> <span class="nx">undo</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">undo</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></figure>
<p>Note that we have to wrap the <code class="language-plaintext highlighter-rouge">newValue</code> function inside a lambda:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">isFn</span> <span class="p">?</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">newValue</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="p">}</span> <span class="p">:</span> <span class="nx">newValue</span><span class="p">;</span>
</code></pre></figure>
<p>If we don’t wrap <code class="language-plaintext highlighter-rouge">newValue</code> this way, then the <code class="language-plaintext highlighter-rouge">restore</code> property will be attached to <code class="language-plaintext highlighter-rouge">newValue</code> and it will leak out of the <code class="language-plaintext highlighter-rouge">revalue</code> function. We don’t want that. It’s safe to attach the <code class="language-plaintext highlighter-rouge">restore</code> property to the lambda:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="k">if</span> <span class="p">(</span><span class="nx">isFn</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">].</span><span class="nx">restore</span> <span class="o">=</span> <span class="nx">undo</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></figure>
<p>And since anything worth doing is worth overdoing, the final version extends <code class="language-plaintext highlighter-rouge">undo</code> to take a callback function. That callback can be passed in as an optional fourth argument to <code class="language-plaintext highlighter-rouge">revalue</code>, or as an optional argument to the <code class="language-plaintext highlighter-rouge">undo</code> function itself. It’s up to the user to make the callback return something useful:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">revalue</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="nx">newValue</span><span class="p">,</span> <span class="nx">undoCallback</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">undo</span><span class="p">,</span> <span class="nx">orig</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">],</span> <span class="nx">isFn</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">newValue</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">function</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">isFn</span> <span class="p">?</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">newValue</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="p">}</span> <span class="p">:</span> <span class="nx">newValue</span><span class="p">;</span>
<span class="nx">undo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">cb</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">orig</span><span class="p">;</span>
<span class="nx">cb</span> <span class="o">=</span> <span class="nx">isFunction</span><span class="p">(</span><span class="nx">cb</span><span class="p">)</span> <span class="p">?</span> <span class="nx">cb</span> <span class="p">:</span>
<span class="p">(</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">undoCallback</span><span class="p">)</span> <span class="p">?</span> <span class="nx">undoCallback</span> <span class="p">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">orig</span><span class="p">;</span> <span class="p">});</span>
<span class="k">return</span> <span class="nx">cb</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="nx">orig</span><span class="p">,</span> <span class="nx">newValue</span><span class="p">);</span>
<span class="p">};</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">isFn</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">prop</span><span class="p">].</span><span class="nx">restore</span> <span class="o">=</span> <span class="nx">undo</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">undo</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></figure>
The Tao of λ: Deduping2013-09-27T00:00:00+00:00/code/2013/09/27/the-tao-of-lambda-deduping
<p>My <a href="http://buzzdecafe.github.io/code/2013/09/05/javascript-y-combinator/">Y Combinator</a> article received a lot of attention, thanks to <a href="http://dailyjs.com/2013/09/20/ycombinator/">DailyJS</a> and <a href="http://javascriptweekly.com/archive/149.html">JavaScript Weekly</a>. While the Y Combinator is a fascinating thing in itself, it is not exactly practical. In fact, it’s almost entirely academic (not that there’s anything wrong with that).</p>
<p>Discussions of functional programming are prone to wander into etherealness. It is tempting to keep abstracting and abstracting until the world of real problems is left way down below. But this need not be the case. Functional programming is a powerful and <em>practical</em> tool for solving real-world problems. And <em>just the right amount</em> of abstraction can be very productive.</p>
<p>Here is an example of a common real-world problem: Deduping an array of objects. Let’s start with an array of simple objects:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">xs</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">2</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">3</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">4</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">4</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">5</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">6</span><span class="p">}}</span>
<span class="p">];</span>
</code></pre></figure>
<p>The output we want is:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="p">[</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">2</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">3</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">4</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">5</span><span class="p">}},</span>
<span class="p">{</span><span class="na">x</span><span class="p">:</span> <span class="p">{</span><span class="na">y</span><span class="p">:</span> <span class="mi">6</span><span class="p">}}</span>
<span class="p">]</span>
</code></pre></figure>
<p>For this example, we don’t care about the order of the output, if it <em>is</em> sorted, that’s just gravy.</p>
<p>I saw code to dedupe an array like this <em>in production</em>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">removeDuplicates</span><span class="p">(</span><span class="nx">xs</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">ilen</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="nx">xObj</span> <span class="o">=</span> <span class="p">{};</span>
<span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">ilen</span> <span class="o">=</span> <span class="nx">xs</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">ilen</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">xObj</span><span class="p">[</span><span class="nx">xs</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">x</span><span class="p">.</span><span class="nx">y</span><span class="p">]</span> <span class="o">=</span> <span class="nx">xs</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
<span class="p">}</span>
<span class="nx">xs</span> <span class="o">=</span> <span class="p">[];</span> <span class="c1">// Yikes!</span>
<span class="k">for</span> <span class="p">(</span><span class="nx">prop</span> <span class="k">in</span> <span class="nx">xObj</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">xObj</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">prop</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">xs</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">xObj</span><span class="p">[</span><span class="nx">prop</span><span class="p">]);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">xs</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></figure>
<p>It works, but there’s a lot to dislike about <code class="language-plaintext highlighter-rouge">removeDuplicates</code>. For example, <code class="language-plaintext highlighter-rouge">removeDuplicates</code> mutates the input array. But the primary problem, for this discussion, is that it requires knowledge of the internals of the passed-in array. The key line is:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">xObj</span><span class="p">[</span><span class="nx">xs</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">x</span><span class="p">.</span><span class="nx">y</span><span class="p">]</span> <span class="o">=</span> <span class="nx">xs</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</code></pre></figure>
<p>Since duplicate values of the <code class="language-plaintext highlighter-rouge">x.y</code> property will overwrite any prior value on <code class="language-plaintext highlighter-rouge">xObj</code>, this is where the definition of object equality is (even though it may not look like it). Objects are considered duplicates if they have the same <code class="language-plaintext highlighter-rouge">y</code> property. We can rewrite this to make a generic deduping function that takes an equality predicate and a list of objects. And this generic version will not mutate the passed-in object either.</p>
<p>Here is the proposed API:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">dedupe</span><span class="p">(</span><span class="nx">equalityPredicate</span><span class="p">,</span> <span class="nx">list</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// dedupe logic here...</span>
<span class="k">return</span> <span class="nx">dedupedList</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></figure>
<p><em>Aside</em>: I deliberately made the predicate the first argument. I am assuming that I can curry this function. I may want to create a specific <code class="language-plaintext highlighter-rouge">xs</code> deduper to reuse from my <code class="language-plaintext highlighter-rouge">dedupe</code> function. Or I may want to define different deduping functions and store them for future use.</p>
<p>Here’s the equality predicate for our <code class="language-plaintext highlighter-rouge">xs</code> object:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">equalXs</span><span class="p">(</span><span class="nx">objA</span><span class="p">,</span> <span class="nx">objB</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">objA</span><span class="p">.</span><span class="nx">x</span><span class="p">.</span><span class="nx">y</span> <span class="o">===</span> <span class="nx">objB</span><span class="p">.</span><span class="nx">x</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></figure>
<p>And here’s an example of how to call <code class="language-plaintext highlighter-rouge">dedupe</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">newXs</span> <span class="o">=</span> <span class="nx">dedupe</span><span class="p">(</span><span class="nx">equalXs</span><span class="p">,</span> <span class="nx">xs</span><span class="p">);</span>
</code></pre></figure>
<p>All that remains is to <em>implement</em> <code class="language-plaintext highlighter-rouge">dedupe</code>. The simplest approach is to compare the head of the list to each element in another list (the “accumulator”) of objects we’ve already tested for uniqueness, using the equality predicate. (Therefore, the first element always goes into the accumulator.) Then recursively work our way through the list testing the object against the accumulated list. If we don’t find the object in the accumulator, then add it to the accumulator. As usual, I will use functions from <a href="https://github.com/Ramda/ramda">Ramda</a> to build this.</p>
<p>Let’s take the spec above apart and look at its components. First, we need a way to iterate over the accumulator and test it for equality with the current object from <code class="language-plaintext highlighter-rouge">xs</code>. The <code class="language-plaintext highlighter-rouge">some</code> function takes a function and a list returns <code class="language-plaintext highlighter-rouge">true</code> if any element in the list satisfies the function:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">some</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">accElem</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">predicate</span><span class="p">(</span><span class="nx">accElem</span><span class="p">,</span> <span class="nx">current</span><span class="p">);</span> <span class="c1">// the equality predicate we will pass in.</span>
<span class="p">},</span> <span class="c1">// `some` will be true when the `current` </span>
<span class="c1">// element is in the accumulator.</span>
<span class="nx">acc</span><span class="p">);</span> <span class="c1">// `acc` is the accumulator.</span>
</code></pre></figure>
<p>And we need to iterate over the passed-in array (<code class="language-plaintext highlighter-rouge">xs</code>) and use the <code class="language-plaintext highlighter-rouge">some</code> test above to determine which objects to accumulate. This sounds like a job for <code class="language-plaintext highlighter-rouge">foldl</code>.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">foldl</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">curr</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// if the element is in the accumulator, return the accumulator;</span>
<span class="c1">// if not, then add the element to the accumulator and return it.</span>
<span class="k">return</span> <span class="p">(</span><span class="nx">some</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">accElem</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">predicate</span><span class="p">(</span><span class="nx">accElem</span><span class="p">,</span> <span class="nx">curr</span><span class="p">);</span> <span class="p">},</span> <span class="nx">acc</span><span class="p">))</span> <span class="p">?</span>
<span class="nx">acc</span> <span class="p">:</span>
<span class="nx">append</span><span class="p">(</span><span class="nx">curr</span><span class="p">,</span> <span class="nx">acc</span><span class="p">);</span>
<span class="p">},</span>
<span class="p">[],</span> <span class="c1">// the accumulator</span>
<span class="nx">list</span><span class="p">);</span> <span class="c1">// `xs` or whatever</span>
</code></pre></figure>
<p>Put it all together, and we have our generic <code class="language-plaintext highlighter-rouge">dedupe</code> function:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">dedupe</span><span class="p">(</span><span class="nx">predicate</span><span class="p">,</span> <span class="nx">list</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">foldl</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">curr</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">(</span><span class="nx">some</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">accElem</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">predicate</span><span class="p">(</span><span class="nx">accElem</span><span class="p">,</span> <span class="nx">curr</span><span class="p">);</span> <span class="p">},</span> <span class="nx">acc</span><span class="p">))</span> <span class="p">?</span>
<span class="nx">acc</span> <span class="p">:</span>
<span class="nx">append</span><span class="p">(</span><span class="nx">curr</span><span class="p">,</span> <span class="nx">acc</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[],</span> <span class="nx">list</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></figure>
<p>There you have it. <code class="language-plaintext highlighter-rouge">dedupe</code> does not require any knowledge of the array that gets passed to it. The <code class="language-plaintext highlighter-rouge">dedupe</code> function is generic; it can be used to dedupe <em>any array of objects that the user can define an equality predicate for</em>. It is entirely up to the caller to define what equality is for his objects with the equality predicate.</p>
<p>This design makes <code class="language-plaintext highlighter-rouge">dedupe</code> robust. Imagine that somehow the spec of <code class="language-plaintext highlighter-rouge">xs</code> changes tomorrow, and now its objects have a <code class="language-plaintext highlighter-rouge">z</code> property, e.g. <code class="language-plaintext highlighter-rouge">{x: {y: 1, z: 100}}</code>. In that case, <code class="language-plaintext highlighter-rouge">removeDuplicates</code> would require some major rewriting. On the other hand, <code class="language-plaintext highlighter-rouge">dedupe</code> would not change <em>at all</em>. All we have to do to accommodate the <code class="language-plaintext highlighter-rouge">z</code> property is change the equality predicate that we pass to <code class="language-plaintext highlighter-rouge">dedupe</code> like so:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">equalXs</span><span class="p">(</span><span class="nx">objA</span><span class="p">,</span> <span class="nx">objB</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">objA</span><span class="p">.</span><span class="nx">x</span><span class="p">.</span><span class="nx">y</span> <span class="o">===</span> <span class="nx">objB</span><span class="p">.</span><span class="nx">x</span><span class="p">.</span><span class="nx">y</span> <span class="o">&&</span> <span class="nx">objA</span><span class="p">.</span><span class="nx">x</span><span class="p">.</span><span class="nx">z</span> <span class="o">===</span> <span class="nx">objB</span><span class="p">.</span><span class="nx">x</span><span class="p">.</span><span class="nx">z</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></figure>
<p>I hope this example demonstrates that functional programming isn’t all ivory tower stuff. In fact, it can be used to improve real code.</p>
<h2 id="update">Update</h2>
<p>Scott Sauyet has provided <a href="http://jsbin.com/oCAvAtU/1">tests for the code above</a>; also see the <a href="http://jsbin.com/oCAvAtU/1/edit">tests’ source code</a>. Scott also took it another step by currying the <code class="language-plaintext highlighter-rouge">some</code> function and producing even leaner code.</p>
Haiku Review: Learn You Some Erlang For Great Good2013-09-26T00:00:00+00:00/code/2013/09/26/review-learn-you-some-erlang-for-great-good
<p>Covering Erlang<br />
Completely as a snowstorm<br />
Takes time to shovel</p>
AngularJS and FirefoxOS2013-09-15T00:00:00+00:00/code/2013/09/15/angularjs-and-firefoxos
<p>I have been happily developing an app for FirefoxOS. I got it into a state of almost working-ish, so on Sunday, I decided it was time to move from testing in the browser to installing it as a “packaged” app; either in the simulator or on the actual phone.</p>
<p>I read the docs on MDN about how to build the app, and how to install it. I got it installed in the simulator and on the phone. I could load the app, and visit its “About” page, but when I tried to load up the “Board” page, it bombed, with the error:</p>
<blockquote>
<p>The address wan’t understood</p>
<p>Firefox doesn’t know how to open this address, because the protocol
(unsafe) isn’t associated with any program.</p>
</blockquote>
<p>WTF? This had never occurred when testing in the browser. After searching around for a while, I posted in the <a href="https://groups.google.com/forum/#!topic/mozilla.dev.b2g/42sm342mBaU">mozilla.dev.b2g</a> group, and after a few hours, I got a solution. The problem is that AngularJS sanitizes URLs that it generates dynamically. Angular has a whitelist of protocols that it supports (viz. http, https, ftp, mailto). Any URL with a protocol not in that list gets prefixed with the protocol “unsafe:”. FirefoxOS packaged apps use the pseudoprotocol “app:”. So if you want to use a URL in your app that relies on AngularJS’s data binding in a FirefoxOS packaged app, you must add the “app” protocol to the whitelist.</p>
<p>Fortunately, this is simple to do. When you configure your Angular app, update the regex it uses for its whitelist:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span> <span class="dl">'</span><span class="s1">myApp</span><span class="dl">'</span><span class="p">,</span> <span class="p">[]</span> <span class="p">).</span><span class="nx">config</span><span class="p">([</span><span class="dl">'</span><span class="s1">$compileProvider</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$compileProvider</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">$compileProvider</span><span class="p">.</span><span class="nx">urlSanitizationWhitelist</span><span class="p">(</span><span class="sr">/^</span><span class="se">\s</span><span class="sr">*</span><span class="se">(</span><span class="sr">https</span><span class="se">?</span><span class="sr">|ftp|mailto|app</span><span class="se">)</span><span class="sr">:/</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">]);</span>
</code></pre></figure>
<p>Thanks to Julien Wajsberg for pointing me to the solution, and to <a href="http://stackoverflow.com/questions/15606751/angular-changes-urls-to-unsafe-in-extension-page">this post on stackoverflow</a> for the details.</p>
Javascript Y Combinator2013-09-05T00:00:00+00:00/code/2013/09/05/javascript-y-combinator
<p>At the end of <a href="http://www.amazon.com/The-Little-Schemer-4th-Edition/dp/0262560992">The Little Schemer</a>, the authors lead you step-by-step through the process of deriving the Y Combinator. They do this repeatedly abstracting a <code class="language-plaintext highlighter-rouge">length</code> function–and then magically, the Y Combinator appears. It is a pretty neat trick, and certainly mind-bending on your first read through the book.</p>
<p>Since Javascript has first-class functions, we can derive the Y Combinator in Javascript as well. I will take a different approach than <em>The Little Schemer</em>. This approach owes a lot to a couple of blog posts I read on the subject<sup><a href="#notes">1</a></sup>.</p>
<p>Since this is a post about recursive functions, then we can use that old chesnut, <code class="language-plaintext highlighter-rouge">factorial</code>. Here is a possible implementation of <code class="language-plaintext highlighter-rouge">factorial</code> in Javascript:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">basicFactorial</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">n</span> <span class="o">===</span> <span class="mi">0</span> <span class="p">?</span> <span class="mi">1</span> <span class="p">:</span> <span class="nx">n</span> <span class="o">*</span> <span class="nx">basicFactorial</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></figure>
<p>Let’s start by making a non-recursive <code class="language-plaintext highlighter-rouge">basicFactorial</code>, which we’ll call <code class="language-plaintext highlighter-rouge">nonRecursive</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">n</span> <span class="o">===</span> <span class="mi">0</span> <span class="p">?</span> <span class="mi">1</span> <span class="p">:</span> <span class="nx">n</span> <span class="o">*</span> <span class="nx">f</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></figure>
<p>All we’ve done here is replace the recursive call of <code class="language-plaintext highlighter-rouge">basicFactorial</code>. Instead, we pass in a function that will get called. We can pass any function that returns something that supports the <code class="language-plaintext highlighter-rouge">*</code> operator:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">nonRecursive</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">})(</span><span class="mi">100</span><span class="p">);</span> <span class="c1">// => 0</span>
<span class="nx">nonRecursive</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">})(</span><span class="mi">100</span><span class="p">);</span> <span class="c1">// => 100</span>
<span class="nx">nonRecursive</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">10</span><span class="p">;</span> <span class="p">})(</span><span class="mi">100</span><span class="p">);</span> <span class="c1">// => 1000</span>
<span class="c1">// ... etc.</span>
</code></pre></figure>
<p>But it starts to get a little interesting when we pass <code class="language-plaintext highlighter-rouge">basicFactorial</code> in there. Then we get back … <code class="language-plaintext highlighter-rouge">basicFactorial</code>!</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">basicFactorial</span><span class="p">)(</span><span class="mi">4</span><span class="p">)</span> <span class="o">===</span> <span class="nx">basicFactorial</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>
<span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">basicFactorial</span><span class="p">)(</span><span class="mi">10</span><span class="p">)</span> <span class="o">===</span> <span class="nx">basicFactorial</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">basicFactorial</span><span class="p">)(</span><span class="mi">17</span><span class="p">)</span> <span class="o">===</span> <span class="nx">basicFactorial</span><span class="p">(</span><span class="mi">17</span><span class="p">);</span>
<span class="c1">// ... etc.</span>
</code></pre></figure>
<p>In other words, <code class="language-plaintext highlighter-rouge">basicFactorial</code> is a <a href="http://mathworld.wolfram.com/FixedPoint.html">fixed point</a> of the function <code class="language-plaintext highlighter-rouge">nonRecursive</code>.</p>
<p>This is pointless in this case, since we have defined <code class="language-plaintext highlighter-rouge">basicFactorial</code> already. But suppose we had not defined <code class="language-plaintext highlighter-rouge">basicFactorial</code>. Wouldn’t it be nice if there was a function that we could pass <code class="language-plaintext highlighter-rouge">nonRecursive</code> to that would return the fixed point of it, i.e. the <code class="language-plaintext highlighter-rouge">factorial</code> function?</p>
<p>That is what the Y Combinator does. Pass <code class="language-plaintext highlighter-rouge">nonRecursive</code> to <code class="language-plaintext highlighter-rouge">Y</code>, and out comes the factorial function:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">Y</span><span class="p">(</span><span class="nx">nonRecursive</span><span class="p">)(</span><span class="mi">100</span><span class="p">);</span> <span class="c1">// 9.33262154439441e+157</span>
</code></pre></figure>
<p>Note that:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">Y</span><span class="p">(</span><span class="nx">nonRecursive</span><span class="p">)(</span><span class="mi">100</span><span class="p">)</span> <span class="o">===</span> <span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">basicFactorial</span><span class="p">)(</span><span class="mi">100</span><span class="p">);</span>
</code></pre></figure>
<p>Or in other words:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">Y</span><span class="p">(</span><span class="nx">nonRecursive</span><span class="p">)(</span><span class="mi">100</span><span class="p">)</span> <span class="o">===</span> <span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">Y</span><span class="p">(</span><span class="nx">nonRecursive</span><span class="p">))(</span><span class="mi">100</span><span class="p">);</span>
</code></pre></figure>
<p>So if we have <code class="language-plaintext highlighter-rouge">Y</code>, we do not need to define <code class="language-plaintext highlighter-rouge">basicFactorial</code> <em>at all</em>, we let <code class="language-plaintext highlighter-rouge">Y</code> derive it from the non-recursive function <code class="language-plaintext highlighter-rouge">nonRecursive</code>. Now let’s look at it from the other direction, and build up to <code class="language-plaintext highlighter-rouge">Y</code>. Here again, is the functional <code class="language-plaintext highlighter-rouge">nonRecursive</code> that we want to calculate the fixed point of:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">n</span> <span class="o">===</span> <span class="mi">0</span> <span class="p">?</span> <span class="mi">1</span> <span class="p">:</span> <span class="nx">n</span> <span class="o">*</span> <span class="nx">f</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></figure>
<p>As noted above, pass <code class="language-plaintext highlighter-rouge">basicFactorial</code> in, and <code class="language-plaintext highlighter-rouge">nonRecursive</code> returns <code class="language-plaintext highlighter-rouge">basicFactorial</code>. Notice that we have pretty much defined factorial in the body of <code class="language-plaintext highlighter-rouge">nonRecursive</code>: <code class="language-plaintext highlighter-rouge">return n === 0 ? 1 : n * f(n-1);</code>–why not use that? So here’s our next try: Apply <code class="language-plaintext highlighter-rouge">nonRecursive</code> to itself. This requires a small change to the body of <code class="language-plaintext highlighter-rouge">nonRecursive</code>, to self-apply the passed-in function to get the body out and apply it to the inner argument.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">n</span> <span class="o">===</span> <span class="mi">0</span> <span class="p">?</span> <span class="mi">1</span> <span class="p">:</span> <span class="nx">n</span> <span class="o">*</span> <span class="nx">f</span><span class="p">(</span><span class="nx">f</span><span class="p">)(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">nonRecursive</span><span class="p">)(</span><span class="mi">5</span><span class="p">);</span> <span class="c1">// => 120</span>
</code></pre></figure>
<p>Now we want to isolate the fixed point function. Let’s wrap that in a function <code class="language-plaintext highlighter-rouge">g</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">nonRecursive</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">g</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">q</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">n</span> <span class="o">===</span> <span class="mi">0</span> <span class="p">?</span> <span class="mi">1</span> <span class="p">:</span> <span class="nx">n</span> <span class="o">*</span> <span class="nx">q</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">};</span>
<span class="k">return</span> <span class="nx">g</span><span class="p">(</span><span class="nx">f</span><span class="p">(</span><span class="nx">f</span><span class="p">))(</span><span class="nx">x</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">}</span>
</code></pre></figure>
<p>Since inner function <code class="language-plaintext highlighter-rouge">g</code> does not depend on anything in closure, we can pull it out:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">g</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">n</span> <span class="o">===</span> <span class="mi">0</span> <span class="p">?</span> <span class="mi">1</span> <span class="p">:</span> <span class="nx">n</span> <span class="o">*</span> <span class="nx">f</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">}</span>
</code></pre></figure>
<p>The pulled-out function may look familiar–it’s <code class="language-plaintext highlighter-rouge">nonRecursive</code> again. Here’s what’s left over after <code class="language-plaintext highlighter-rouge">g</code> (a.k.a. <code class="language-plaintext highlighter-rouge">nonRecursive</code>) is pulled out; let’s call it <code class="language-plaintext highlighter-rouge">almostY</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">almostY</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">g</span><span class="p">(</span><span class="nx">f</span><span class="p">(</span><span class="nx">f</span><span class="p">))(</span><span class="nx">x</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="nx">almostY</span><span class="p">(</span><span class="nx">almostY</span><span class="p">)(</span><span class="mi">5</span><span class="p">);</span> <span class="c1">// => 120</span>
</code></pre></figure>
<p>We’ve pulled <code class="language-plaintext highlighter-rouge">g</code> out of <code class="language-plaintext highlighter-rouge">almostY</code>, but <code class="language-plaintext highlighter-rouge">almostY</code> still depends on <code class="language-plaintext highlighter-rouge">g</code>. The final step is to wrap <code class="language-plaintext highlighter-rouge">almostY</code> in a function that takes the functional <code class="language-plaintext highlighter-rouge">g</code> as an argument. Then <code class="language-plaintext highlighter-rouge">almostY</code> will have no dependencies.</p>
<p>So, let’s wrap it in a function that takes our non-recursive factorial functional and returns the fixed point of it. And since this is the last step, let’s call that function <code class="language-plaintext highlighter-rouge">Y</code>:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">Y</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">h</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">f</span><span class="p">(</span><span class="nx">h</span><span class="p">(</span><span class="nx">h</span><span class="p">))(</span><span class="nx">x</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">};</span>
<span class="k">return</span> <span class="nx">p</span><span class="p">(</span><span class="nx">p</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">Y</span><span class="p">(</span><span class="nx">g</span><span class="p">)(</span><span class="mi">6</span><span class="p">);</span> <span class="c1">// => 720</span>
</code></pre></figure>
<p>Holy crap! It works! But it’s not just for factorial–<code class="language-plaintext highlighter-rouge">Y</code> will provide a fixed point for any unary function, e.g.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="kd">function</span> <span class="nx">nonRecursiveFibonacci</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">n</span> <span class="o"><</span> <span class="mi">2</span> <span class="p">?</span> <span class="nx">n</span> <span class="p">:</span> <span class="nx">f</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nx">f</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="nx">Y</span><span class="p">(</span><span class="nx">nonRecursiveFibonacci</span><span class="p">)(</span><span class="mi">10</span><span class="p">);</span> <span class="c1">// => 55</span>
</code></pre></figure>
<p>As presented, this version of <code class="language-plaintext highlighter-rouge">Y</code> can only handle unary functions, and it will blow up the stack for relatively low values of <code class="language-plaintext highlighter-rouge">n</code>. It is straightforward to extend <code class="language-plaintext highlighter-rouge">Y</code> to handle functions of any arity, and to memoize it.</p>
<h3 id="notes">Notes</h3>
<ol>
<li>I found these articles helpful: <a href="http://matt.might.net/articles/implementation-of-recursive-fixed-point-y-combinator-in-javascript-for-memoization/">Fixed-point combinators in JavaScript: Memoizing recursive functions</a> and <a href="http://blog.jcoglan.com/2008/01/10/deriving-the-y-combinator/">Deriving the Y combinator</a>.</li>
</ol>
“I don’t care” parameters2013-08-29T00:00:00+00:00/code/2013/08/29/i-dont-care-parameters
<p>I’ve been studying Erlang lately. It’s a lot of fun, and the language has some great features. One aspect of Erlang that appeals to me is pattern matching. You implement a function with different behaviors based on the arguments. For example, the <code class="language-plaintext highlighter-rouge">factorial</code> function in Erlang can be defined as:</p>
<figure class="highlight"><pre><code class="language-erlang" data-lang="erlang"> <span class="nf">factorial</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">-></span> <span class="mi">1</span><span class="p">;</span>
<span class="nf">factorial</span><span class="p">(</span><span class="nv">N</span><span class="p">)</span> <span class="o">-></span>
<span class="nv">N</span> <span class="o">*</span> <span class="nf">factorial</span><span class="p">(</span><span class="nv">N</span><span class="o">-</span><span class="mi">1</span><span class="p">).</span>
</code></pre></figure>
<p>This makes for tight and elegant code; you don’t need to check your arguments and have branching logic. Of course in this case, I would probably add a constraint to the second one, i.e. <code class="language-plaintext highlighter-rouge">factorial(N) when N > 1 -> ...</code>, since if <code class="language-plaintext highlighter-rouge">N < 1</code> then we’ll have a problem. Constraints are another great, expressive feature of the language.</p>
<p>Erlang takes pattern matching an extra step, borrowing from its ancestor Prolog: It uses the underscore character <code class="language-plaintext highlighter-rouge">_</code> (or any parameter name that starts with <code class="language-plaintext highlighter-rouge">_</code>) as a throw-away parameter. So you can pattern match on a function with a signature like:</p>
<figure class="highlight"><pre><code class="language-erlang" data-lang="erlang"> <span class="nf">some_func</span><span class="p">(_,</span> <span class="nv">X</span><span class="p">,</span> <span class="p">_)</span> <span class="k">when</span> <span class="nv">X</span> <span class="o">=:=</span> <span class="mi">0</span> <span class="o">-></span>
<span class="nv">X</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="nf">some_func</span><span class="p">(_,</span> <span class="p">_,</span> <span class="nv">Y</span><span class="p">)</span> <span class="k">when</span> <span class="nv">Y</span> <span class="o">=:=</span> <span class="mi">0</span> <span class="o">-></span>
<span class="nv">Y</span> <span class="o">+</span> <span class="mi">2</span><span class="p">;</span>
<span class="nf">some_func</span><span class="p">(_,</span> <span class="p">_,</span> <span class="p">_)</span> <span class="o">-></span>
<span class="n">ok</span><span class="p">.</span>
</code></pre></figure>
<p>Again, I find this clear and elegant.</p>
<p>At work, I’m on a <em>very</em> large project that uses some jQuery, probably more jQuery than most of us would like. It seems like at least once a day, I get burned by writing code like this:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">$</span><span class="p">.</span><span class="nx">each</span><span class="p">([</span><span class="mi">10</span><span class="p">,</span><span class="mi">20</span><span class="p">,</span><span class="mi">30</span><span class="p">,</span><span class="mi">40</span><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></figure>
<p>See the bug? What do you think this will log to console? The answer is <code class="language-plaintext highlighter-rouge">[0,1,2,3]</code>. Oops. The bug is that jQuery’s <code class="language-plaintext highlighter-rouge">each</code> function, for some God-forsaken reason, <em>takes the index of the collection as its first argument</em>, and the item as its second argument.</p>
<p>So I’ve borrowed the “I don’t care” parameter idea from Erlang, and now I write <code class="language-plaintext highlighter-rouge">jQuery.each</code> like so:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">$</span><span class="p">.</span><span class="nx">each</span><span class="p">([</span><span class="mi">10</span><span class="p">,</span><span class="mi">20</span><span class="p">,</span><span class="mi">30</span><span class="p">,</span><span class="mi">40</span><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span> <span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span> <span class="c1">// 10, 20, 30, 40</span>
<span class="p">});</span>
</code></pre></figure>
<p>I like the look of this–the underscore character suggests “I could be any value; I don’t care” to me. I prefer it to <code class="language-plaintext highlighter-rouge">function(index, item)</code> where <code class="language-plaintext highlighter-rouge">index</code> never gets used. It seems like <code class="language-plaintext highlighter-rouge">index</code> should get used–it has a name!</p>
<p>There are some downsides to this approach:</p>
<ul>
<li>If you lint your code (and you should), JSLint will complain about the underscore character, although you can turn that warning off.</li>
<li>Using the underscore for multiple “I don’t care” parameters will also fail lint, e.g. <code class="language-plaintext highlighter-rouge">function f(_, _, x)</code>. You can turn that off too, but probably shouldn’t.</li>
<li>If you are using a library such as Underscore or Lodash, the underscore parameter will mask that variable inside the function in question.</li>
<li>Some dev in the future may work on the code and decide he wants to use the “I don’t care” argument, but not change the parameter name. Well, you’ll be long gone by then, right?</li>
</ul>
<p>So, <em>caveat emptor</em>.</p>
The Firefox has landed2013-08-25T00:00:00+00:00/2013/08/25/the-firefox-has-landed
<p>The delivery range was listed as “August 21 - August 21.” It was August 24 when my new FirefoxOS phone arrived. The phone is inexpensive, and it is underpowered compared to high-end iPhones and Android devices. But it has a major advantage over both iPhones and Android phones: It’s not made by Apple or Google.</p>
<p>I am a phone Luddite. This is my first smart phone. I find Apple’s treatment of users and developers repellant, and I don’t want to carry an ad-lead-generator for Google around in my pocket. The alternative was nothing, since obviously a Windows phone is <em>completely out of the question</em>. I suppose there’s Blackberry, too. Didn’t care.</p>
<p>These phone-resisting tendencies were reinforced by Stallman’s comments on cell phones:</p>
<blockquote>
<p>I don’t have a cell phone. I won’t carry a cell phone. It’s Stalin’s dream. Cell phones are tools of Big Brother. I’m not going to carry a tracking device that records where I go all the time, and I’m not going to carry a surveillance device that can be turned on to eavesdrop.</p>
</blockquote>
<p>The quote is from <a href="https://www.networkworld.com/news/2011/031611-stallman-reaction.html">Network World, March 16, 2011</a>. At the time, Stallman was mocked as a crank (e.g., “Richard Stallman is kind of a lunatic. He’s been tinfoil hat for many years now,” from the same article). Recent revelations about the surveillance state have proven him right–it’s not paranoia when it turns out that you have <em>understated</em> the problem.</p>
<p>In any case, the Firefox phone has the advantage of being free software, <em>as far as I know</em>. That was enough for me. Firefox has been my browser of choice at home for years, even through the lean years; even when Chrome was pushing the boundaries of browser performance and capability. As Google slides more and more into the antithesis of its famous slogan, <a href="http://www.mozilla.org/en-US/about/manifesto/">Mozilla</a> is once again in the position of being the defender of open standards and user freedom on the Web. That’s worth supporting, even if it means an <em>underpowered phone</em>.</p>
<p>As <a href="http://mashable.com/2011/11/18/linus-torvalds-apple-lockdown/">Linus Torvalds put it</a>:</p>
<blockquote>
<p>Technologies that lock things down tend to lose in the end.</p>
</blockquote>
<p>Don’t bet against the open Web.</p>
The project project2013-08-20T00:00:00+00:00/code/2013/08/20/the-project-project
<p>What should the contract of a function called <code class="language-plaintext highlighter-rouge">project</code> be? Suppose you have a collection of objects like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var table = [
{a: 1, b: 2, c: 3},
{a: 10, b: 20, c: 30},
{a: 12, c: 32},
{b: 22, c: 42},
{c: 300}
];
</code></pre></div></div>
<p>… and we want to fetch the <code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code> attributes of each object in <code class="language-plaintext highlighter-rouge">table</code>. Maybe I want to get back a set like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[
{a:1, b:2},
{a:10, b:20}
]
</code></pre></div></div>
<p>i.e., if an attribute is undefined on the input object, then the object doesn’t appear in the output. In terms of relational algebra, getting this output takes two operations; one to select the objects that have defined properties, and one project those properties onto the output objects. They are associative, but it’s smart to select first, then project, since you may have fewer objects to iterate over after the selection.</p>
<p>For now, the simple, algebraic approach is what we’re going to take with <code class="language-plaintext highlighter-rouge">project</code> in <a href="https://github.com/ramda/ramda">Ramda</a>. In other words, <code class="language-plaintext highlighter-rouge">project</code> will simply project; it’s up to the caller to pre-select the input table or filter the output results. But there is more to it than that. The implementation of <code class="language-plaintext highlighter-rouge">pick</code> checks for the existence of a name on the input object before copying the value over to the projected object, i.e.:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>project(['a', 'b'])(table)
</code></pre></div></div>
<p>will output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[
{a: 1, b:2},
{a:10, b: 20},
{a: 12},
{b: 22},
{}
]
</code></pre></div></div>
<p>So we’ve got a projected object out for every object in the input <code class="language-plaintext highlighter-rouge">table</code>, but if the attribute was undefined in the table, it doesn’t exist in the output. (Incidentally, this is how underscore does it.) Is that what we want? Or does this output make more sense for a simple <code class="language-plaintext highlighter-rouge">project</code>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[
{a: 1, b:2},
{a:10, b: 20},
{a: 12, b: undefined},
{a: undefined, b: 22},
{a: undefined, b: undefined}
]
</code></pre></div></div>
<p>This is essentially how a SQL-style <code class="language-plaintext highlighter-rouge">project</code> works (substitute <code class="language-plaintext highlighter-rouge">null</code> for <code class="language-plaintext highlighter-rouge">undefined</code>). This is simple enough to achieve by writing a new version of <code class="language-plaintext highlighter-rouge">pick</code>, called say, <code class="language-plaintext highlighter-rouge">pickAll</code>, that does not test for properties on the input object:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>R.pickAll = curry(function(names, object) {
var copy = {};
each(function(name) {
copy[name] = object[name];
}, names);
return copy;
});
</code></pre></div></div>
<p>Then compose <code class="language-plaintext highlighter-rouge">map</code> and <code class="language-plaintext highlighter-rouge">pickAll</code>, and you’ve got a <code class="language-plaintext highlighter-rouge">project</code>-style function that guarantees that the output objects will have the desired properties, even if they are undefined. There are two benefits of this; first, this is consistent with relational algebra and familiar from SQL; and second, projected objects will report the same result when enumerating their keys. Of course, they will still report the value of that key as undefined, exactly as the original <code class="language-plaintext highlighter-rouge">pick</code> would.</p>
Function composition2013-08-15T00:00:00+00:00/code/2013/08/15/on-function-composition
<p>My friend and former (and future?) colleague, Paul Grenier, recently posted on the topic of <a href="http://autosponge.github.io/blog/2013/02/09/variadic-composition-without-recursion/">function composition</a> in Javascript. Paul takes the angle that we can avoid some of the performance problems associated with the functional style (although at the cost of some maintainability–constructed functions are not the most pleasant thing to debug).</p>
<p>We use a similar approach to “memoizing” functions by arity in <a href="https://github.com/ramda/ramda">Ramda</a> that Paul recommends (cf. <code class="language-plaintext highlighter-rouge">nAry</code> function). Our implementation of a variadic <code class="language-plaintext highlighter-rouge">compose</code> function is straightforward:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var compose = function() {
var fns = slice(arguments);
return function() {
return foldr(function(fn, args) {return [fn.apply(this, args)];}, slice(arguments), fns)[0];
};
};
</code></pre></div></div>
<p>Since we’ve implemented <code class="language-plaintext highlighter-rouge">foldr</code> in an imperative fashion (eeeeew), the performance penalty is negligible. And since the intent of <code class="language-plaintext highlighter-rouge">compose</code> is typically to generate a function once to use over and over, then <code class="language-plaintext highlighter-rouge">compose</code> may not be a great target for performance optimization in the first place.</p>
<p>Ultimately, what I want to do is be able to compose some really useful functions on the fly, with as little code as possible. I’m not there yet. Part of the problem is how to handle variadic functions. (That is a topic for another time: Composing Curried Variadic Functions. That should have a broad audience.)</p>
<p>For example, I’d like to compose <code class="language-plaintext highlighter-rouge">map</code> and <code class="language-plaintext highlighter-rouge">pick</code> to give me a function that would project attributes over an array of objects. This is analogous to a <code class="language-plaintext highlighter-rouge">SELECT x, y, z</code> statement in SQL. (Scott started down this road, but when he took some time off, I took up the torch.) This would be nice:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var project = compose(map, pick);
var selected = project(attrs, objects);
</code></pre></div></div>
<p>At present, this doesn’t work in Ramda because <code class="language-plaintext highlighter-rouge">pick</code> comes out of <code class="language-plaintext highlighter-rouge">curry</code> not knowing what its arity is. You can work around that like this, but isn’t as elegant:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var project = compose(map, pick);
var selected = project(attrs)(objects);
</code></pre></div></div>
<p>Why do something if you can’t do it elegantly? Furthermore, the “function butt” makes some Puritanical developers uncomfortable.</p>
<p>In Ramda we have another issue. Since <code class="language-plaintext highlighter-rouge">pick</code> will return an empty object if the passed-in object doesn’t have any of the passed in properties, this simple <code class="language-plaintext highlighter-rouge">project</code> will not behave like a SQL-style projection should: It won’t filter objects with undefined properties; it will include as many objects in its output as are given to it in its table parameter.</p>
<p>You can hack around that, of course, by filtering the table on the way into <code class="language-plaintext highlighter-rouge">project</code>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>project = curry(function(keys, table) {
return compose(map, pick)(keys)(filter(function(row) {
return all(function(key){ return row[key] !== undef; }, keys);
}, table));
});
</code></pre></div></div>
<p>… but now this is starting to get ugly. A better approach may be to compose <code class="language-plaintext highlighter-rouge">project</code> out of a function that won’t return an empty object.</p>
<p>Well, it’s a work in progress, and there is plenty of room to improve!</p>