<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Imaginary Numbers]]></title>
  <link href="http://www.alanmacdougall.com//atom.xml" rel="self"/>
  <link href="http://www.alanmacdougall.com//"/>
  <updated>2013-02-03T16:31:56-05:00</updated>
  <id>http://www.alanmacdougall.com//</id>
  <author>
    <name><![CDATA[Alan MacDougall]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Refactoring to Events]]></title>
    <link href="http://www.alanmacdougall.com//blog/2013/01/04/refactoring-to-events/"/>
    <updated>2013-01-04T09:44:00-05:00</updated>
    <id>http://www.alanmacdougall.com//blog/2013/01/04/refactoring-to-events</id>
    <content type="html"><![CDATA[<p>Event-driven programming is a flexible weapon&#8230; like a whip. Design things
right, and a flick of the wrist can roll down the length of your architecture
and knock a cigarette out of a man&#8217;s mouth with a supersonic snap. Design wrong,
and a half-hour later you&#8217;re in the emergency room with a wadded up T-shirt
clamped to your forehead.</p>

<p>As a front-end developer, I&#8217;ve whipped myself in the forehead more times than I
care to count. Do that often enough, and you start to get an intuition about
things. I&#8217;ve got a theory about event handling: <em>make your decisions at the
right level of abstraction.</em></p>

<p>Maybe this is old hat. It should have been old hat to me, too, but you can&#8217;t see
how old a hat is when you&#8217;re wearing it. But first let&#8217;s talk about kinds of
events.</p>

<!-- more -->


<h2>Event Types</h2>

<p>Events come in three flavors.</p>

<h3>Notifications</h3>

<p>When something happens in your application, and you want to respond to it
elsewhere, that causes another kind of event. I generally call these
&#8220;notifications.&#8221; Displaying a popup when there&#8217;s new mail, or updating a view
when the underlying data changes, or checking for that damned 140-character
limit; those are all notifications. You aren&#8217;t reporting on the results of a
delayed process, and crucially, you aren&#8217;t directly handling a user action.</p>

<h3>Completions</h3>

<p>Sometimes you set a metaphorical wheel spinning, and you want to know when it
comes to rest. Downloads, uploads, API requests, background jobs of all kinds.
Maybe an actual wheel. Point is, you started it; you just don&#8217;t know when it&#8217;s
going to end. When it&#8217;s done, you can continue with simple straight-line code. I
tend to just call these &#8220;completion&#8221; events.</p>

<h3>Intents</h3>

<p>The last big kind of event, and the topic of this article, is what I call an
&#8220;intent.&#8221; I borrowed the term from Android, and the new &#8220;web intents&#8221; that are
not quite sweeping the internet just yet. An event that forces a decision is an
intent. It could be user input, it could be server data that forces you down a
different code path: either way, new information just entered your system. You
might have to put an extra layer in your code to turn a plain-jane click into
something with a little more meat to it. Maybe something like this. Assume the
existence of an <code>Emitter</code> mixin which adds <code>on</code> and <code>emit</code> methods.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Intents</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">init</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">intents</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// begin listening for events which reflect an intent</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#photos a.select-photo&quot;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">photoId</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">data</span><span class="p">(</span><span class="s2">&quot;photoId&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">intents</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s2">&quot;intent:select-photo&quot;</span><span class="p">,</span> <span class="nx">photoId</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">_</span><span class="p">(</span><span class="nx">Intents</span><span class="p">).</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Emitter</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now your UI logic is held at arm&#8217;s length: if you want to know that the user is
selecting a photo, you just handle the <code>intent:select-photo</code> event. Many UI
events could cause that intent to happen: a mouse click, a keyboard command, a
press of the undo button if your app has that functionality. And by the same
token, the intent could have more than one handler.</p>

<p>So far, we&#8217;re just talking about an event dispatcher; in fact, it&#8217;s not a long
step to get from here to the Command pattern, hooking the same command action up
to more than one UI component. But the real win here is conceptual: we don&#8217;t
know <em>a priori</em> what a mouse click signifies, but &#8220;select-photo&#8221; plus a photo id
is unambiguous. This pattern saves you from keeping all your domain logic in a
briar patch of jQuery callbacks; but it also gives you concrete concepts to work
with as your application evolves.</p>

<h2>Response and Responsibility</h2>

<p>Sometimes, to handle an event, you need to make decisions. Should the user be
able to delete this photo? Does this link prompt a paywall? Should we display a
toast notification, and if so, what data should it contain? If the event handler
is close to the event source, this is easy: simply make the decision and move
on.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">photoSelector</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;select&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">photo</span><span class="p">.</span><span class="nx">someCondition</span> <span class="o">==</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">takeAction</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">displayError</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Straightforward. Uncontroversial. But you know as well as I do that
&#8220;straightforward&#8221; never stays that way for very long.</p>

<h3>Working Too Hard <em>Is</em> Hardly Working</h3>

<p>Take Paperless Post. Users buy <em>coins</em>. You use coins to gussy up your cards.
Choosing a fancy card design uses coins, so when a user selects a new design, we
have to handle the <em>selection</em> by loading up the new graphics and adjusting the
layout&#8230; but we also have to add coins to the price of the card. If the card
used to be free, that means we have to display a paywall, and if not, we display
a brief message. On the paywall, if the user clicks the <em>cancel</em> button, we have
to undo the design change.</p>

<p>Hear that sound? That distant crashing, crumbling noise? Areas of concern,
smashing into each other and cracking and breaking and falling into the sea.</p>

<p>For a long time, we coded as if there was only one event happening here. The
user chose a new card design, and we handled it like this:</p>

<ol>
<li>Change the card design.</li>
<li>Show the right UI for the price change.</li>
</ol>


<p>But there are two events here, not one. First the user selects the design
change. We can handle that on the spot. Then the price changes. These are two
different things, no two ways about it. Instead, we should handle it like this:</p>

<ol>
<li>Change the card design.</li>
<li>Set the price.</li>
</ol>


<p>And then handle the price change somewhere else. Different component, maybe.
Heck, maybe a different architectural layer. You just have to ask yourself one
thing: &#8220;Does this decision make sense here?&#8221; If your selection handler is
displaying a paywall, you can bet your bottom dollar the answer is no.</p>

<p>In short, if your event handler is making too many decisions, look for a way to
spread that hard work around. If it worked for Tom Sawyer, it can work for you.</p>

<h3>Gratifaction</h3>

<p>Our situation at Paperless Post was more complicated than I&#8217;m letting on. The
selection handler did not make the paywall decision&#8230; but it gathered
information for it. It looked something like this.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">linerSelector</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;change&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">newLiner</span> <span class="o">=</span> <span class="nx">PP</span><span class="p">.</span><span class="nx">assets</span><span class="p">.</span><span class="nx">findById</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">oldCost</span> <span class="o">=</span> <span class="nx">PP</span><span class="p">.</span><span class="nx">price</span><span class="p">.</span><span class="nx">calculate</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">card</span><span class="p">.</span><span class="nx">liner</span> <span class="o">=</span> <span class="nx">newLiner</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">newCost</span> <span class="o">=</span> <span class="nx">PP</span><span class="p">.</span><span class="nx">price</span><span class="p">.</span><span class="nx">calculate</span><span class="p">();</span> <span class="c1">// different result now</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">PP</span><span class="p">.</span><span class="nx">assets</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s2">&quot;assetChanged&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">asset</span><span class="o">:</span> <span class="nx">newLiner</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">oldCost</span><span class="o">:</span> <span class="nx">oldCost</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">newCost</span><span class="o">:</span> <span class="nx">newCost</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">undoFunction</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><span class="nx">PP</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">backtrack</span><span class="p">();}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Maybe we were too close to the barn to make out more than just some red painted
wood, but we had this in our codebase for a long time. Still do, in fact. But
now I know what&#8217;s wrong. To decide whether to pop the paywall, we need to know
if the price went up. Sure. But why in heck is that code lumped in with the
liner setter? The price calculator should handle all that business by itself. It
should store its own snapshots of the past prices, and when it hears that
<code>assetChanged</code> event, it should do its own math.</p>

<h2>tl;dr</h2>

<p>Rule of thumb: put your decisions close to the events that prompt them. If an
event handler is doing too much work, maybe a new event type should exist in
your system. Don&#8217;t worry that you are adding too many layers of abstraction. If
you design the abstractions right up front, sure, you end up with
<a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/aop/config/SimpleBeanFactoryAwareAspectInstanceFactory.html">SimpleBeanFactoryAwareAspectInstanceFactory</a>.
But if you have a problem, and a new layer of abstraction is the solution, don&#8217;t
look a git horse in the commit.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fixing xorg crash in Ubuntu 12.04 on Thinkpad T520i]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/09/01/fixing-thinkpad-t520i-xorg-crash-in-xubuntu-12-dot-04/"/>
    <updated>2012-09-01T13:48:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/09/01/fixing-thinkpad-t520i-xorg-crash-in-xubuntu-12-dot-04</id>
    <content type="html"><![CDATA[<p>Like a lot of folks these days, I use OSX at work. There&#8217;s a lot to love there.
If I can get over the sticker shock, I&#8217;ll probably get a Mac myself on the next
go-round. But for now, my personal laptop is a Thinkpad T520i running Xubuntu.
If you&#8217;re on the same train, you might have noticed that ever since the 12.04
update, sometimes your laptop doesn&#8217;t quite sleep right. You close the lid and
that crescent moon just sits there blinking quietly, and when you open it back
up, the entire desktop has crashed, dropping you to the login screen. You log
back in, nothing works right. You check the error report, and it says xorg
crashed; you go deeper, and you find an error handling SIGABRT. What does it
mean? You tell me.</p>

<!-- more -->


<p>There&#8217;s a fix, but I had to play bug-report hopscotch before I found it. I
finally fetched up on <a href="https://bugs.launchpad.net/debian/+source/xorg-server/+bug/956071">this bug report</a>.
Sure, this bug&#8217;s title names an error I wasn&#8217;t getting, and its description has
repro steps that aren&#8217;t relevant, and it talks about a crash in a system that
wasn&#8217;t crashing for me&#8230; but when I applied the fix from <a href="https://bugs.launchpad.net/debian/+source/xorg-server/+bug/956071/comments/32">comment 32</a>,
I never got that crash-to-login again. As a good friend always says, &#8220;A W is a
W.&#8221;</p>

<p>Here&#8217;s the fix, step by step:</p>

<ol>
<li>Downgrade your touchpad driver from the command line: <code>sudo apt-get install
xserver-xorg-input-synaptics=1.5.99.902-0ubuntu5</code></li>
<li>Start the Synaptic Package Manager.</li>
<li>Type &#8220;xserver-xorg-input-synaptics&#8221; in the Quick Filter field, then click
that package to select it.</li>
<li>From the Package menu at the top of the application, check the &#8220;Lock&#8221; option.</li>
</ol>


<p>Done deal. That package is downgraded, and since you locked it in the package
manager, you don&#8217;t have to worry about the updater undoing your hard work. This
fix worked for me, but it was a shot in the dark. Call it luck; or call it good
aim. Either way, I hope yours is as good as mine.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Interactive Debugging with Pry]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/06/08/interactive-debugging-with-pry/"/>
    <updated>2012-06-08T12:20:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/06/08/interactive-debugging-with-pry</id>
    <content type="html"><![CDATA[<p>I wrote a <a href="http://www.alanmacdougall.com/blog/2012/03/27/using-vim-slime-with-pry-for-repl-perfection/">post about pry earlier</a>,
but at the time, I didn&#8217;t realize just how much muscle Pry was packing. Install
two simple plugins and one builtin function, and you turn Pry into a stepping
debugger. It can pause at a breakpoint, step through code one line at a time,
and even shuttle up and down the call stack; and since you never lose your Pry
superpowers, you can rummage around your state to your heart&#8217;s content.</p>

<!-- more -->


<h2>Time Stop</h2>

<p><code>binding.pry</code>. Two simple words with immense power. Speak them aloud, and your
program will pause in place, frozen in time, while the Pry REPL springs up
around it. Here&#8217;s an example, from <a href="https://github.com/amacdougall/puppy-presenter">the single most important project on Github</a>,
the cutting-edge technology behind the <a href="http://www.alanmacdougall.com//puppies/">Puppy Presenter</a>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># generate HTML from template</span>
</span><span class='line'><span class="n">template</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">read</span> <span class="n">config</span><span class="o">[</span><span class="s2">&quot;files&quot;</span><span class="o">][</span><span class="s2">&quot;template&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="nb">binding</span><span class="o">.</span><span class="n">pry</span> <span class="c1"># ENTER THE MATRIX</span>
</span><span class='line'>
</span><span class='line'><span class="n">engine</span> <span class="o">=</span> <span class="no">Haml</span><span class="o">::</span><span class="no">Engine</span><span class="o">.</span><span class="n">new</span> <span class="n">template</span><span class="p">,</span> <span class="ss">:format</span> <span class="o">=&gt;</span> <span class="ss">:html5</span><span class="p">;</span>
</span><span class='line'><span class="n">output</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">render</span> <span class="no">Object</span><span class="o">.</span><span class="n">new</span><span class="p">,</span> <span class="ss">:images</span> <span class="o">=&gt;</span> <span class="n">images</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This scrap of script crams cute puppies into a HAML template, but first,
<code>binding.pry</code> freezes reality. Loops stop looping, events stop listening, and
the world halts in an eyeblink. Except for you. You have total freedom: you can
peek at your code and tinker with its innards at will. To resume, <code>Ctrl-D</code>; your
code will roar back to life and keep going until it hits another <code>binding.pry</code>.</p>

<p>If you run your local Rails instance with <code>rails server</code> or <code>./script/server</code>,
you can even drop into a Pry session right in your terminal, using the same
<code>binding.pry</code> technique. Rails debug spam stops: Pry starts.</p>

<h2>One Step at a Time</h2>

<p>The <code>pry-nav</code> plugin makes it easy to execute your code one step at a time. When
your code hits the brick wall of <code>binding.py</code>, you can walk it forward, line by
line, with <code>next</code> &#8211; or if you&#8217;re not feeling so talkative, <a href="https://github.com/nixme/pry-nav#pry-nav">alias it to &#8216;n&#8217;</a>
in <code>.pryrc</code>.</p>

<p><img src="http://www.alanmacdougall.com//post_content/2012-06-08-interactive-debugging-with-pry/pry_debugging_002.png" alt="frozen in time" /></p>

<p>We&#8217;re paused at <code>binding.pry</code>; now we can step forward.</p>

<p><img src="http://www.alanmacdougall.com//post_content/2012-06-08-interactive-debugging-with-pry/pry_debugging_003.png" alt="advancing one step" /></p>

<p>Note the arrow showing us what line we&#8217;re on. We can execute any code we want at
the command line; we&#8217;ll get our output and then skim a little off the top.</p>

<p><img src="http://www.alanmacdougall.com//post_content/2012-06-08-interactive-debugging-with-pry/pry_debugging_004.png" alt="reading some output" /></p>

<p><code>gem install pry-nav</code> or add it to your <code>Gemfile</code> to acquire it; <code>require
'pry-nav'</code> to equip it.</p>

<h2>Elevator Action</h2>

<p>The <code>pry-stack_explorer</code> gem lets you move up and down the call stack. Can&#8217;t
debug much of anything without that. These two methods make a nice easy target.
They don&#8217;t do much of anything, so there&#8217;s nothing to debug, but they&#8217;re simple,
so debugging is easy. Life should be more like that.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;pry&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;pry-nav&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;pry-stack_explorer&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">outer</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">number</span><span class="p">)</span>
</span><span class='line'>  <span class="n">inner</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>  <span class="n">local</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>  <span class="nb">binding</span><span class="o">.</span><span class="n">pry</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">outer</span><span class="p">(</span><span class="s2">&quot;hello&quot;</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Plain old Pry lets you look at your locals when <code>binding.pry</code> sets its teeth.
Try to look at something outside the current scope, though&#8230;</p>

<p><img src="http://www.alanmacdougall.com//post_content/2012-06-08-interactive-debugging-with-pry/pry_debugging_005.png" alt="only locals available" /></p>

<p>Ruby stonewalls you, but <code>pry-stack_explorer</code> doesn&#8217;t care much for walls. Just
use <code>up</code> and <code>down</code> to traverse the stack.</p>

<p><img src="http://www.alanmacdougall.com//post_content/2012-06-08-interactive-debugging-with-pry/pry_debugging_006.png" alt="going up the stack" /></p>

<p>Your program hasn&#8217;t moved&#8230; just your point of view. <code>show-stack</code> shows you the
whole call stack, with a little arrow saying <em>you are here</em>.</p>

<h2>Further Reading</h2>

<p>In <a href="http://banisterfiend.wordpress.com/2012/02/14/the-pry-ecosystem/">this post by Pry&#8217;s author</a>,
you can read more about <code>pry-nav</code>, <code>pry-stack_explorer</code>, and other plugins that
might help you out. And if you got something out of this post, why not <a href="https://twitter.com/alan_macdougall">follow me on Twitter</a>
to stay on top of things? I promise not to clutter your feed with an endless
parade of Foursquare checkins and Instagrams of beer.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Quick Block Uncommenting]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/05/29/quick-block-uncommenting/"/>
    <updated>2012-05-29T15:15:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/05/29/quick-block-uncommenting</id>
    <content type="html"><![CDATA[<p>A quick and easy way of commenting or uncommenting large blocks of code in
languages with multiline comments, such as the <code>/* wing comments */</code> found in
C-like languages:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="cm">/* DEBUG: display complicated logging data</span>
</span><span class='line'><span class="cm">$.log(&quot;Baking.Cookies.recipe.build:&quot;,</span>
</span><span class='line'><span class="cm">  &quot;recipe_id =&gt; &quot;, recipe_id,</span>
</span><span class='line'><span class="cm">  &quot;; recipe_contents =&gt; &quot;, $.extend(true, {}, recipe), // deep clone</span>
</span><span class='line'><span class="cm">  &quot;; options =&gt; &quot;, options</span>
</span><span class='line'><span class="cm">);</span>
</span><span class='line'><span class="cm">// */</span>
</span></code></pre></td></tr></table></div></figure>


<p>Right now the whole block is commented out; but when you cap the top wing
comment, you get this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="cm">/* DEBUG: display complicated logging data */</span>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Baking.Cookies.recipe.build:&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;recipe_id =&gt; &quot;</span><span class="p">,</span> <span class="nx">recipe_id</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;; recipe_contents =&gt; &quot;</span><span class="p">,</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="kc">true</span><span class="p">,</span> <span class="p">{},</span> <span class="nx">recipe</span><span class="p">),</span> <span class="c1">// deep clone</span>
</span><span class='line'>  <span class="s2">&quot;; options =&gt; &quot;</span><span class="p">,</span> <span class="nx">options</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'><span class="c1">// */</span>
</span></code></pre></td></tr></table></div></figure>


<p>Your code editor certainly provides a way of toggling comments, but over large
code blocks this may involve making a large selection first. With this
technique, adding or removing just two bytes can toggle comments on a block of
any length.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How We Added Time Travel to Paperless Post]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/05/01/how-i-added-time-travel-to-paperless-post/"/>
    <updated>2012-05-01T19:15:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/05/01/how-i-added-time-travel-to-paperless-post</id>
    <content type="html"><![CDATA[<p>We recently completed a major feature at Paperless Post:
<a href="http://dev.paperlesspost.com/blog/2012/05/01/how-we-added-time-travel-to-paperless-post/">a full undo/redo system</a>.
The post covers the Command pattern, and how easy it is to implement in both
JavaScript and ActionScript&#8230; and how hard it is to apply that implementation
to a large living application. I&#8217;ll be posting some specific war stories in the
future, but for now, click through and enjoy.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Focusing on the Task at Hand with Git]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/05/01/focusing-on-the-task-at-hand-with-git/"/>
    <updated>2012-05-01T16:29:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/05/01/focusing-on-the-task-at-hand-with-git</id>
    <content type="html"><![CDATA[<p>Every day or so, there&#8217;s a new front-page <a href="http://news.ycombinator.com">HN</a>
article about Git. New GUIs, for those who find the command line ugly or
abstruse. New CLIs, for those who find Git confusing. New workflows, for those
who can&#8217;t quite get Git to fit their style. New tutorials, for the long tail of
new Git users. New deep-dive technical articles, for those who can&#8217;t get enough
of SHAs and refs.</p>

<p><a href="http://www.hnsearch.com/search#request/submissions&amp;q=git&amp;sortby=points+desc">Here&#8217;s where to start</a>,
if you&#8217;ve got a few hours to burn; but if you want my opinion, you don&#8217;t need
any of that. I use Git to get work done, and here&#8217;s how.</p>

<!-- more -->


<p>There&#8217;s plenty of tutorial noise out there, and I won&#8217;t be one to add to the
ruckus. If you&#8217;ve read <a href="http://progit.org/book/">Pro Git</a>, you&#8217;re ready. If not,
read it now. I&#8217;ll wait.</p>

<p>Now you&#8217;re ready. Check out your master branch. Create a feature branch. Work on
that branch until the feature&#8217;s ready. If master changes, be sure to merge it
into your feature branch to resolve conflicts before they get to be a problem.
When the feature&#8217;s ready, merge it back into master and deploy.</p>

<p>That&#8217;s it. That&#8217;s the workflow. Do your work, don&#8217;t burn all your brainpower on
perfecting your Git.</p>

<p>Got teammates? Have them each work on their own fork of a &#8220;blessed&#8221; repository.
Set up the blessed repo and all the forks as remotes. <code>git remote update</code> every
day. This gives you flexibility and control, and saves you from the central-repo
hell of stomping all over one another&#8217;s history by pushing different commits to
the same branch of the same repo.</p>

<p>Got complex features? Want to test them together before merging them into
master? Fine, make a staging branch. Merge feature branches into it; merge it
into master when it&#8217;s good.</p>

<p>The common theme here? You&#8217;re paring your troubles down to just a few, and in
the process, you&#8217;re sweeping your mental attic for cobwebs. Once you check out a
feature branch and get your coffee, it&#8217;s just you, your editor, and a straight
road ahead. Like it should be.</p>

<p>You want to use Git right? Use it to <em>focus</em>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using vim-slime with Pry for REPL Perfection]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/03/27/using-vim-slime-with-pry-for-repl-perfection/"/>
    <updated>2012-03-27T11:21:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/03/27/using-vim-slime-with-pry-for-repl-perfection</id>
    <content type="html"><![CDATA[<p>I used to use Python for my everyday scripting tasks, but since I started
working at <a href="http://www.paperlesspost.com">Paperless Post</a>, a Rails shop, I&#8217;ve
felt like investing some skill points in Ruby would be a wise investment. Ruby
is fun to write, but my workflow suffered from a severe lack of interactive
programming support. No, irb doesn&#8217;t cut it, not for someone used to the mighty
<a href="http://dreampie.sourceforge.net/">Dreampie</a>. I was heartbroken&#8230; until I
discovered an alternative. It&#8217;s not a single powerful app, like
Dreampie&thinsp;&#8212;&thinsp;instead, I had to stitch together several tools
to get the same effects. But it makes exploratory programming a breeze, and
that&#8217;s more than I can say for irb.</p>

<p>To build this interactive-programming Frankenstein&#8217;s monster, you&#8217;ll need three
tools: vim, tmux, and Pry.</p>

<!-- more -->


<h2>The Tools</h2>

<p><a href="http://tmux.sourceforge.net/">tmux</a> is
<a href="http://www.gnu.org/software/screen/">GNU screen</a> if GNU screen beat the final
boss and started again with NewGame+. It&#8217;s a powerful beast, and I&#8217;ve barely
begun to scratch the surface. I like its status bar and scrollback pager, and
when sshing into a remote, tmux splits are like mojitos on a hot
day&thinsp;&#8212;&thinsp;once you have them, you realize you needed them all
along.</p>

<p><a href="http://pry.github.com/">Pry</a> is a replacement for irb. If I&#8217;ve barely scratched
the surface of tmux, it&#8217;s safe to say that I haven&#8217;t even given Pry a belly rub.
Since my Ruby is as rusty as an old railroad bridge, I&#8217;ve gotten a lot of
mileage out of its <code>ls</code> and <code>show-doc</code> features. Did you know that <code>ls []</code>, for
instance, shows not only all the properties and methods of the object, but what
module those methods came from? <em>Exceedingly</em> useful when working with a
codebase laced with mixins. You can use <code>pry</code> as your Rails console by invoking
<a href="https://github.com/pry/pry/wiki/Setting-up-Rails-or-Heroku-to-use-Pry">these incantations</a>.</p>

<p><a href="http://www.vim.org/">vim</a> needs no introduction, but you&#8217;ll also need the
<a href="https://github.com/jpalardy/vim-slime">vim-slime</a> plugin, which lets you send
text straight from vim into tmux. That&#8217;s what ties this whole mess together and
makes it work. Install the plugin and follow the configuration steps in its
README.</p>

<h2>The Steps</h2>

<ol>
<li>Run vim.</li>
<li>Run tmux in a separate terminal.</li>
<li>Run pry in a tmux window.</li>
<li>Type some Ruby in vim and return to normal mode.</li>
<li><code>C-c C-c</code>; you can just hold Ctrl and double-tap <code>c</code>.</li>
</ol>


<p>Now that entire paragraph of Ruby code&thinsp;&#8212;&thinsp;the line you&#8217;re on
and all adjacent lines north and south of it&thinsp;&#8212;&thinsp;gets sent to
the pry session and executed. You&#8217;re in business. You can also visually select
some specific lines and hit the same sequence. Same deal.</p>

<h2>The Payoff</h2>

<p>Write your Ruby program line by line, testing each line by sending it to pry.
By using pry&#8217;s <code>cd</code> function, you can even go into a class and define or
redefine its methods. Try this out:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Test</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">greeting</span>
</span><span class='line'>    <span class="s2">&quot;hello&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="nb">test</span> <span class="o">=</span> <span class="no">Test</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>
</span><span class='line'><span class="n">cd</span> <span class="no">Test</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">greeting</span>
</span><span class='line'>  <span class="s2">&quot;what&#39;s up?&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">cd</span> <span class="o">.</span><span class="n">.</span>
</span><span class='line'>
</span><span class='line'><span class="nb">test</span><span class="o">.</span><span class="n">greeting</span> <span class="c1"># returns &quot;what&#39;s up?&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since you&#8217;re writing the program right there in vim, there&#8217;s relatively little
cleanup necessary to get the code into a useable form; and since you&#8217;re testing
it in pry all along, there&#8217;s no write/run cycle to use up your keystrokes or
mental effort. Writing, experimenting, testing, and polishing are as tight as
four fingers in a fist.</p>

<h2>Update: Pry as a Stepping Debugger</h2>

<p>Since writing this post, I&#8217;ve learned a lot more about how to use Pry to debug a
running program. Yes, even Rails. <a href="http://www.alanmacdougall.com/blog/2012/06/08/interactive-debugging-with-pry/">Interactive Debugging with Pry</a>
has the scoop.</p>

<p>Like this post? Find it useful?
<a href="http://www.twitter.com/alan_macdougall">Follow me on Twitter</a> to hear when I&#8217;ve
got a new one. Or <a href="http://www.alanmacdougall.com/atom.xml">get the RSS feed</a> if
you&#8217;re on that side of the
<a href="http://stage.vambenepe.com/archives/1932">war on RSS</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mozilla Documents the Open Web]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/03/20/mozilla-documents-the-open-web/"/>
    <updated>2012-03-20T10:28:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/03/20/mozilla-documents-the-open-web</id>
    <content type="html"><![CDATA[<p>Documentation sucks.</p>

<p>The <em>process</em> of documentation sucks, so developers resist doing it. Hacking on
a library is fun, but explaining precisely how to use the library is not.
Perhaps an early run-in with the keyhole essay imbued the coder with a lifelong
distaste for exposition; perhaps blank-page syndrome attacks the would-be
documentor the moment he loads <code>README.md</code> into Sublime Text 2; or perhaps it is
simply that instructing the computer comes more naturally than educating humans.</p>

<p>When there is a stab at documentation, it is often halfhearted. API docs
generated from code which has no doc comments, sparsely commented example apps
with no explanation of the underlying concepts, a one-page &#8220;quick start&#8221; with no
further elaboration: these sins are widespread, and although they may be widely
scorned, they are also widely duplicated.</p>

<p>But somehow, documentation for open web technologies is worse.</p>

<!-- more -->


<h2>Web Language Documentation Is Terrible</h2>

<p>Even when it is more complete, it is worse. Even when it was clearly the labor
of dozens of people over a span of years, it is worse. Even when it is
comprehensive, it is worse. Sometimes its very comprehensiveness just
accentuates the cancer at its core.</p>

<p>HTML documentation presents lists of tags and attributes, with browser support
annotations. Sadly, those lists often treat all tags and attributes as equals,
relegating the mighty <code>&lt;div&gt;</code> to the same column as the lowly <code>&lt;dd&gt;</code>, when they
would be better placed in different categories. Browser support information is
spotty; this is forgivable when the cutting edge of browser development is a
moving target, but it is still a pervasive source of misinformation. HTML
documentation seldom teaches actual best practices. In all, HTML documentation
is like HTML: roughly suited to its purpose, but awkward in its form, clumsy in
its implementation, full of poorly defined edge cases, and always changing just
a little too slowly to live up to the demands placed upon it.</p>

<p>CSS documentation is bad for most of the same reasons, but it suffers from one
additional flaw which blows all the rest out of the water: CSS itself is
unsuited for layout. This means that when documentation attempts to explain
the uses of relative, absolute, and static positioning, of the various box
models, and especially of the eternally frustrating <code>float</code> and <code>clear</code>,
it ultimately causes as much confusion as it cures. Don&#8217;t believe me about CSS?
Without checking a reference or using a framework, design a layout where three
columns, with background colors, have equal height even when their contents are
unequal. There&#8217;s a reason this layout was called &#8220;The Holy Grail&#8221;: it was
thought to be a myth, and the quest for it was epic. If you were reading
<a href="http://www.alistapart.com">A List Apart</a> in the early 2000s, you remember.</p>

<p>JavaScript documentation has a different problem. JavaScript is suited to its
purpose, despite its various flaws, but most documentation still teaches the
JavaScript of five to ten years ago. Good JavaScript programmers have kept with
the program: they take advantage of frameworks and libraries, they write
flexible asynchronous code with a solid understanding of scope and execution
order, they use namespacing heavily and modules as appropriate. Beginning
JavaScript programmers do not, and most JavaScript documentation does little to
show them a better way. When it does, it turns people who could have been
JavaScript programmers into jQuery programmers: overly pragmatic programmers who
can never understand or expand their system.</p>

<h2>Misinformation, and Who Is Fixing It</h2>

<p>Misinformation abounds. w3schools is <a href="http://w3fools.com/">an excellent example</a>
and a prize target for sniping, because its undeserved linkjuice superglues its
results to the top of every Google search for HTML, CSS, or JavaScript
documentation. However, it is by no means the only offender. Virtually every
site contains misinformation of some sort or, nearly as bad, conceptual holes
where information should be.</p>

<p>But the Mozilla Developer Network, long one of the best resources, is
<a href="http://hacks.mozilla.org/2012/03/helping-with-the-mdn-what-about-linking-to-us/">doing the right thing</a>.
They&#8217;re aiming for freshness and relevancy, striving to write documentation for
all levels of programmers, and they&#8217;re soliciting outside submissions. Let&#8217;s
have more. With time, maybe MDN can finally beat out w3schools just as
StackOverflow did to Experts Exchange.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Octopress Engaged]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/03/11/octopress-engaged/"/>
    <updated>2012-03-11T23:03:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/03/11/octopress-engaged</id>
    <content type="html"><![CDATA[<p>The previous version of this site was built on Django, mainly so I could try it
out. Django impressed me with its powerful templating, admin, and plugins, but I
think I tried to get too cute with it: I had a test subdomain with its own
database, I had multiple settings files for different contexts, I had custom
comment display and submission forms, and on and on, and simply put, I wasn&#8217;t
<em>writing</em>.</p>

<!-- more -->


<p>Django wasn&#8217;t getting out of my way; instead, it was occasion for
endless tweaking. I didn&#8217;t have a sane deployment strategy, either, so every
update meant hitting <code>git status</code> and using that as a laundry list for sFTP. So
much friction I&#8217;ve still got rug burn.</p>

<p>Meanwhile, I&#8217;ve been mentoring a friend in his first steps with Python and HTML,
and one of his first serious projects is a static blog generation script written
in Python. It got me thinking, how come that little script is simple, yet so
powerful&#8212;while I&#8217;ve spent dozens and dozens of hours fiddling with Django
and have relatively little to show?</p>

<p>Enter Octopress. Jekyll was already a great idea, but the turnkey nature of
Octopress completes it. Its native Markdown orientation means that blogging
feels fast and light, especially with my little
<a href="https://gist.github.com/1989803">focus dealie</a> to keep me in Zen mode. And the
builtin deployment options&#8212;I use rsync&#8212;are just what the doctor
ordered. Of course, the site now <em>looks</em> like every other Octopress blog, but
that&#8217;s hardly a bad thing, because Octopress looks beautiful right out of the
box. I&#8217;ll customize it somewhat in coming days. Or weeks. Or never. Like I said,
I don&#8217;t want to tweak my blog: I want to write it.</p>

<p>I&#8217;ve ported my previous posts (only five of them, but they&#8217;re quality!) from the
old system, and hooked up Disqus, so if you&#8217;re stumbling across this now, please
read and comment.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Function Transformation]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/03/11/function-transformation/"/>
    <updated>2012-03-11T10:59:00-04:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/03/11/function-transformation</id>
    <content type="html"><![CDATA[<p>Modern JavaScript is firmly on the side of magic. Why write a hundred-line set
of meticulous loops when you can write a ten-line filter chain? Why invoke a
factory object dozens of times when you can write a map function? And if you
want your application&#8217;s behavior to change from moment to moment, why use
explicit states, or a Strategy pattern, or reference a global flag, when you can
just swap out the functions themselves?</p>

<p>And why swap functions yourself? Let the functions do that for you. Wind them
up. Let them run.</p>

<!-- more -->


<p>(From here on, I&#8217;ll be using JavaScript instead of ActionScript in my examples,
but the concepts are 100% identical. If you use
<a href="http://www.github.com/amacdougall/underscore.as/">underscore.as</a>, you can use
very similar code in ActionScript 3. <a href="http://jquery.com">jQuery</a> needs no
introduction.)</p>

<h2>Laborious Authentication</h2>

<p>You&#8217;ve seen code like this a million times &#8211; and in my opinion, that&#8217;s 999,999
times too many.</p>

<p>HTML:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;blogExample&quot;</span> <span class="na">id=</span><span class="s">&quot;example_01&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h1&gt;</span>Imaginary Blog Post<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;</span>Here is the content of the blog post.<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h1</span> <span class="na">class=</span><span class="s">&quot;addComment&quot;</span><span class="nt">&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Add Comment<span class="nt">&lt;/a&gt;&lt;/h1&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;commentForm hidden&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>(Normal comment submission form.)<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;loginForm hidden&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>(Login form: username, password.)<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;&lt;button&gt;</span>Submit<span class="nt">&lt;/button&gt;&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>JavaScript:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// wrapped in an instantly-executing function to avoid variable spillover</span>
</span><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">authenticated</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$content</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#example_01&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$commentForm</span> <span class="o">=</span> <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;div.commentForm&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$loginForm</span> <span class="o">=</span> <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;div.loginForm&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">addComment</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">authenticated</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$commentForm</span><span class="p">.</span><span class="nx">show</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">$loginForm</span><span class="p">.</span><span class="nx">hide</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$loginForm</span><span class="p">.</span><span class="nx">show</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;h1.addComment a&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">addComment</span><span class="p">();</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$loginForm</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;button&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">parent</span><span class="p">().</span><span class="nx">html</span><span class="p">(</span><span class="s2">&quot;logging in...&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="c1">// adding a delay to simulate a success callback</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">successHandler</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">authenticated</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">addComment</span><span class="p">();</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">_</span><span class="p">(</span><span class="nx">successHandler</span><span class="p">).</span><span class="nx">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can load the live example inline below.</p>

<div id="example_01" class="functionTransformation blogExample"><a href="http://www.alanmacdougall.com//post_content/00050_wrapping/example_01.html">Example 01 (click to load)</a></div>


<p>This code is pretty straightforward. First we locate DOM elements using jQuery,
using the leading <code>$</code> to indicate that they should only hold jQuery-wrapped
elements. Hungarian notation? Guilty, but at least it&#8217;s
<a href="http://www.joelonsoftware.com/articles/Wrong.html">the good kind</a>.
Our DOM objects located, we define <code>addComment</code> to show the comment form if
possible, and the login form if necessary; and finally, we arrange for the login
form to call <code>addComment</code> again on a successful login.</p>

<p>If you have only one action on your site which requires a login, this kind of
structure is perfectly reasonable. Once you have two, however, you find yourself
copying your login form everywhere, and giving it a different success handler
each time, so it can resume a different user action. You can generate the login
form by cloning a hidden DOM element, but a more insidious problem remains: your
<code>addComment</code> function has to understand the <em>concept</em> of authentication. Any
other function that requires authentication <em>also</em> has to understand the
concept. You will be writing <code>if (authenticated)</code> until the day you die or your
app becomes obsolete&#8212;whichever comes first.</p>

<p>(Remember, it&#8217;s bad when people never use your app. It&#8217;s terrible when they never
stop. Written any good IE6 workarounds lately?)</p>

<h2>Sorcerous Authentication</h2>

<p>How do we take authentication out of our functions and put it all in one place?
Short answer: <em>sorcery</em>. If you&#8217;ve been paying attention to my constant campaign
for passing functions as values, you might immediately think of something like
this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">addComment</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">authenticated</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// show comment form</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">authenticate</span><span class="p">(</span><span class="nx">addComment</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And then somewhere else...</span>
</span><span class='line'><span class="cm">/** Execute the supplied callback after user is authenticated. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">authenticate</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">authenticated</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">callback</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">loginForm</span><span class="p">.</span><span class="nx">show</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">loginForm</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s2">&quot;success&quot;</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this is definitely much closer to something I&#8217;d want to use. All our login
handling code moves to a separate function, <code>authenticate</code>, which is not
connected to commenting at all. <code>authenticate</code> can do its work and then execute
the callback to resume the workflow. But your <code>addComment</code> function still
includes the knowledge that the user must be authenticated. Imagine that in some
contexts, you allow anonymous comments, but in others, you don&#8217;t: now you have
to write two functions (bad), or include logic in the function to decide whether
a login is required (far worse).</p>

<p>Instead, let&#8217;s put the authentication requirement where it&#8217;s most relevant: in
the code which defines the behavior of the page itself. <code>addComment</code> can remain
pleasantly generic, while this specific button prompts anonymous users for their
credentials.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">authenticated</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$content</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#example_02&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$commentForm</span> <span class="o">=</span> <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;div.commentForm&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$loginForm</span> <span class="o">=</span> <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;div.loginForm&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">addComment</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$commentForm</span><span class="p">.</span><span class="nx">show</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">requireLogin</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">authenticated</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">callback</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">// on login success, execute and remove callback</span>
</span><span class='line'>          <span class="nx">$loginForm</span><span class="p">.</span><span class="nx">one</span><span class="p">(</span><span class="s2">&quot;success&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$loginForm</span><span class="p">.</span><span class="nx">hide</span><span class="p">();</span>
</span><span class='line'>            <span class="nx">callback</span><span class="p">();</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>          <span class="nx">$loginForm</span><span class="p">.</span><span class="nx">show</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// set up $loginForm events</span>
</span><span class='line'>    <span class="nx">$loginForm</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;a&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// simulate successful login after talking to server</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">parent</span><span class="p">().</span><span class="nx">html</span><span class="p">(</span><span class="s2">&quot;logging in...&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">_</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">authenticated</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">$loginForm</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s2">&quot;success&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}).</span><span class="nx">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;h1.addComment a&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="nx">requireLogin</span><span class="p">(</span><span class="nx">addComment</span><span class="p">));</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can load the live example inline below.</p>

<div id="example_02" class="functionTransformation blogExample"><a href="http://www.alanmacdougall.com//post_content/00050_wrapping/example_02.html">Example 02 (click to load)</a></div>


<p>The magical line here is <code>foo.click(requireLogin(addComment));</code>. <code>requireLogin</code>
creates a function which displays the login form if necessary, and handles its
<code>success</code> event by executing <code>addComment</code>. If no login is necessary, the
function returned from <code>requireLogin</code> calls <code>addComment</code> immediately. In other
words, the anonymous function which handles the login is <em>wrapped around</em> the
function which handles comments; so this type of function is called a &#8220;wrapper.&#8221;
You could also say that the login functionality is a &#8220;decoration&#8221; which can be
applied to any function; so a function like <code>requireLogin</code> is called a
&#8221;<a href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator</a>.&#8221;</p>

<p>In a more general sense, <code>addComment</code> goes in, and what comes back is something
that can be used exactly the same way&#8230; but which has extra powers.
<code>requireLogin</code> is the gamma-ray chamber. <code>addComment</code> is Bruce Banner. We just
took a function and <em>changed it</em>, while still using it in the same code. If you
know object-oriented programming, the concept
<a href="http://en.wikipedia.org/wiki/Polymorphism_(computer_science)">may sound familiar</a>.
Polymorphism: it&#8217;s not just for subclasses anymore!</p>

<h2>Tinker Toys</h2>

<p>That example showed how to prevent the default functionality until a condition
is met, but we can also use decorators to augment a method&#8212;to make it do
more than it did before. Our weapon is <code>_.compose</code>, an underscore.js method
which transforms a list of functions into a single one which combines all the
functions into a single pipeline.</p>

<p>For a simple example of composition:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">foo</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="s2">&quot;foo&quot;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">message</span> <span class="o">||</span> <span class="s2">&quot;&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">bar</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="s2">&quot;bar&quot;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">message</span> <span class="o">||</span> <span class="s2">&quot;&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">baz</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="s2">&quot;baz&quot;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">message</span> <span class="o">||</span> <span class="s2">&quot;&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">composed</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">compose</span><span class="p">(</span><span class="nx">foo</span><span class="p">,</span> <span class="nx">bar</span><span class="p">,</span> <span class="nx">baz</span><span class="p">);</span>
</span><span class='line'><span class="nx">composed</span><span class="p">();</span> <span class="c1">// returns &quot;foobarbaz&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example, <code>composed</code> is a function which runs <code>baz</code>, then <code>bar</code>, then
<code>foo</code>, passing the output of each function as input to the next. The output of
<code>baz</code> is &#8220;baz&#8221;; <code>bar</code> places &#8220;bar&#8221; in front of it to make &#8220;barbaz&#8221;; and so on.
<code>(message || "")</code> returns the empty string if <code>message</code> is null or false. We&#8217;re
accustomed to reading from left to right, so this may feel strange, but once
you&#8217;re accustomed to it, <code>_.compose</code> is a powerful tool. Here&#8217;s a more practical
example: the &#8220;insert&#8221; and &#8220;delete&#8221; buttons add blocks of random text, while
&#8220;bold&#8221; and &#8220;italic&#8221; act as modifiers. Try this live example first; the code
follows.</p>

<div id="example_03" class="functionTransformation blogExample"><a href="http://www.alanmacdougall.com//post_content/00050_wrapping/example_03.html">Example 03 (click to load)</a></div>


<p>HTML:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;controls&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;controlBlock&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">class=</span><span class="s">&quot;insert&quot;</span><span class="nt">&gt;</span>Insert<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">class=</span><span class="s">&quot;delete&quot;</span><span class="nt">&gt;</span>Delete<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;controlBlock&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">decorator=</span><span class="s">&quot;makeBold&quot;</span><span class="nt">&gt;</span>Bold<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">decorator=</span><span class="s">&quot;makeItalic&quot;</span><span class="nt">&gt;</span>Italic<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;p&gt;</span>Click <span class="nt">&lt;i&gt;</span>insert<span class="nt">&lt;/i&gt;</span> and <span class="nt">&lt;i&gt;</span>delete<span class="nt">&lt;/i&gt;</span> to add and remove elements.<span class="nt">&lt;/p&gt;</span>
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;itemList&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the much more interesting JavaScript:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// find and jQuerify all needed DOM elements</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$content</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#example_03&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$itemList</span> <span class="o">=</span> <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;div.itemList&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$insertButton</span> <span class="o">=</span> <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;div.controls button.insert&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$deleteButton</span> <span class="o">=</span> <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;div.controls button.delete&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">dummyText</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>      <span class="s2">&quot;Ant&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Bumblebee&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Butterfly&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Cricket&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Dragonfly&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Grasshopper&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Ladybug&quot;</span>
</span><span class='line'>    <span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/** The function to be used to add example elements. */</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">buildElement</span> <span class="o">=</span> <span class="nx">buildRandomText</span><span class="p">;</span>
</span><span class='line'>    <span class="cm">/** Decorator functions used to add styles. */</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">currentDecorators</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">buildRandomText</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">randomText</span> <span class="o">=</span> <span class="nx">dummyText</span><span class="p">[</span><span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nx">dummyText</span><span class="p">.</span><span class="nx">length</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">())];</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;&lt;p&gt;&quot;</span> <span class="o">+</span> <span class="nx">randomText</span> <span class="o">+</span> <span class="s2">&quot;&lt;/p&gt;&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">decorators</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">makeItalic</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$element</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$element</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s2">&quot;italic&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">makeBold</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$element</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$element</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s2">&quot;bold&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$insertButton</span><span class="p">.</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$itemList</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="nx">buildElement</span><span class="p">());</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$deleteButton</span><span class="p">.</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$itemList</span><span class="p">.</span><span class="nx">children</span><span class="p">().</span><span class="nx">last</span><span class="p">().</span><span class="nx">remove</span><span class="p">();</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$content</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&quot;button[decorator]&quot;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">toggleClass</span><span class="p">(</span><span class="s2">&quot;selected&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">toggleDecorator</span><span class="p">(</span><span class="nx">decorators</span><span class="p">[</span><span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s2">&quot;decorator&quot;</span><span class="p">)]);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Toggles presence of the supplied function in the decorators array, then</span>
</span><span class='line'><span class="cm">     * regenerates the buildElement function.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">toggleDecorator</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">currentDecorators</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">currentDecorators</span><span class="p">).</span><span class="nx">include</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="o">?</span>
</span><span class='line'>        <span class="nx">_</span><span class="p">(</span><span class="nx">currentDecorators</span><span class="p">).</span><span class="nx">without</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="o">:</span>
</span><span class='line'>        <span class="nx">currentDecorators</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">f</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">buildElement</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">compose</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">currentDecorators</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">buildRandomText</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>The easiest way to understand this example is to focus on the <code>buildElement</code>
function; or rather, the function which is assigned to the <code>buildElement</code>
variable. At first, we assign it <code>buildRandomText</code>; but clicking the &#8220;bold&#8221; or
&#8220;italic&#8221; buttons alters that assignment. Click &#8220;bold&#8221;, and the <code>makeBold</code>
function is added to the <code>currentDecorators</code> array. Click again, and the
function is removed. The underscore.js method <code>_.without</code> makes it easy to
remove a known value from an array; and the mapping between HTML attributes and
method names in a namespace may be brittle, but it&#8217;s also extremely convenient.
Pick your poison. And once <code>currentDecorators</code> has some content, <code>_.compose</code>
comes into play.</p>

<p>If &#8220;bold&#8221; is selected and &#8220;italic&#8221; is not, <code>currentDecorators</code> only contains <code>makeBold</code>.
Let us revisit the definition of that function:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// it&#39;s defined a bit differently in the example,</span>
</span><span class='line'><span class="c1">// but the effect is identical</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">makeBold</span><span class="p">(</span><span class="nx">$element</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">$element</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s2">&quot;bold&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The function accepts a jQuery element, and returns it after adding the &#8220;bold&#8221;
class. Simple as that; but more complicated decorators are easy to imagine. In
this case, the decorator is earning its name: it literally applies decorations
to a UI element. An element goes in; an element which <em>should</em> have the same use
case comes out. Remember, decorated functions are meant to be drop-in
replacements for their originals.</p>

<p><code>_.compose(makeBold, buildRandomText)</code> creates and returns a function which
could otherwise be expressed as <code>makeBold(buildRandomText())</code>&#8230; and now perhaps
you see why the arguments to <code>_.compose</code> are written left to right. Add italic,
and you&#8217;ll get a function which has the same effect as
<code>makeItalic(makeBold(buildRandomText()))</code>. The rightmost function just has to
return a value; each other function has to accept the value returned from the
next one.</p>

<h3>A side note: Function.apply</h3>

<p>Sadly, <code>_.compose</code> takes variable arguments, not an array of methods, so we have
to use <code>Function.apply</code> before it will operate on our <code>currentDecorators</code> array.
Functions are objects; they can have methods. <code>Function.apply</code> executes the
function within a given context (<code>null</code> is sufficient here), and passes it each
array element as an argument. To put it another way, any function you can call
like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">myFunction</span><span class="p">(</span><span class="nx">alpha</span><span class="p">,</span> <span class="nx">beta</span><span class="p">,</span> <span class="nx">gamma</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>&#8230;can also be called like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">myFunction</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="p">[</span><span class="nx">alpha</span><span class="p">,</span> <span class="nx">beta</span><span class="p">,</span> <span class="nx">gamma</span><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Have you ever written a loop to find the largest number in an array? From now
on, use <code>Math.max.apply(null, values)</code>. Who&#8217;s the coolest kid on the block?
Read <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply">Mozilla Developer Network&#8217;s excellent documentation</a>
for a bit more detail.</p>

<h2>Real-World Closures</h2>

<p>I know you&#8217;re champing at the bit to go write code with like a zillion closures,
but you know deep in your heart that it&#8217;s all just showboating. You don&#8217;t have
to use this stuff to get real work done, right? And if you do, it won&#8217;t save you
much time over just writing some loops and storing some variables in a plain and
simple data structure. You may be right! But that didn&#8217;t stop us at
<a href="http://www.paperlesspost.com">Paperless Post</a> from using closures as part of
our upcoming undo/redo system. Stay tuned to our developer blog for a writeup.
Lots of interesting nuts and bolts.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Closures in List Transformation]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/03/10/closures-in-list-transformation/"/>
    <updated>2012-03-10T12:39:00-05:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/03/10/closures-in-list-transformation</id>
    <content type="html"><![CDATA[<p>A closure stores information. It can have access to a single parameter given to
it at runtime; or to an internal data structure it can use to make decisions; or
even to large chunks of your program&#8217;s state, letting you pass <em>behavior</em>
without needing to pass <em>information</em>. In this post, I&#8217;ll show you how to use
closures to work with arrays: in a few lines of code, you can grind a nested
data structure down to just a handful of targeted values. With a few more, you
can transform them into anything you need. And with a pinch of closure fairy
dust, you can make those filters and transforms <em>magical</em>, building powerful and
intelligent functionality up from a few lines of initializer code. The results
will fascinate and horrify. But mostly fascinate.</p>

<!-- more -->


<h2>Basic List Filtering</h2>

<p>Let&#8217;s start slow: filtering a list. Let&#8217;s start with this class, which
represents an enemy in a video game.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 01 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Alien</span> <span class="kd">extends</span> <span class="nb">Sprite</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">level</span><span class="o">:</span><span class="nb">int</span><span class="o">;</span>   <span class="c1">// experience level</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">health</span><span class="o">:</span><span class="nb">int</span><span class="o">;</span>  <span class="c1">// remaining health</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">weapon</span><span class="o">:</span><span class="nx">Weapon</span><span class="o">;</span> <span class="c1">// equipped weapon</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now create a bunch of aliens at random xy positions between 100 and -100. To
figure out which ones are onscreen at the moment, we&#8217;ll filter out all the
aliens whose x and y are less than 0; or to put it another way, <em>select</em> all the
aliens whose x and y are greater.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 02 */</span>
</span><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Returns a random number between abs and -abs.</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">randomPosition</span><span class="p">(</span><span class="nx">abs</span><span class="o">:</span><span class="nb">Number</span><span class="p">)</span><span class="o">:</span><span class="nb">Number</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">(</span><span class="nx">abs</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">())</span> <span class="o">-</span> <span class="nx">abs</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// create 12 new aliens at random positions</span>
</span><span class='line'><span class="k">var</span> <span class="nx">aliens</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="k">while</span> <span class="p">(</span><span class="nx">aliens</span><span class="p">.</span><span class="nx">length</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Alien</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">alien</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">randomPosition</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">alien</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">randomPosition</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">aliens</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">alien</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// get only the aliens with x and y &gt; 0</span>
</span><span class='line'><span class="k">var</span> <span class="nx">onscreenAliens</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span> <span class="k">in</span> <span class="nx">aliens</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">alien</span><span class="p">.</span><span class="nx">x</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">y</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">onscreenAliens</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">alien</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// now rewrite it with Array.filter</span>
</span><span class='line'><span class="k">var</span> <span class="nx">onscreenAliens</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">aliens</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">s</span><span class="o">:</span><span class="nb">Sprite</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">sprite</span><span class="p">.</span><span class="nx">x</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">sprite</span><span class="p">.</span><span class="nx">y</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we know we&#8217;re going to do a lot of these filtering operations, it makes sense
to define the filter function somewhere else. And since <code>Array.filter</code> returns a
new <code>Array</code> containing only the selected elements, we can chain the calls
together.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 03 */</span>
</span><span class='line'><span class="cm">/** Filter: returns only onscreen aliens. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">onScreen</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">x</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">y</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/** Filter: returns only aliens wielding gauss rifles. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">hasGaussRifle</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">weapon</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="s2">&quot;gaussRifle&quot;</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">rifleAliens</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">aliens</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">onScreen</span><span class="p">).</span><span class="nx">filter</span><span class="p">(</span><span class="nx">hasGaussRifle</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>With this method, we&#8217;re getting closer to something useful and flexible; but we
still need a separate function for every filtering condition, even if some of
them are very simple. We need a way to parameterize our filters, and that&#8217;s
where closures come in.</p>

<h2>Smart Filters</h2>

<p>From here on, we&#8217;ll use the underscore.as version of <code>filter</code>, which doesn&#8217;t
require that obnoxious three-argument function. It does, however, require each
chain to begin with <code>.chain()</code> and end with either <code>.value()</code> or <code>.each()</code>, for
reasons we&#8217;ll discuss soon. It&#8217;s a tradeoff: underscore.as grants more power
than <code>Array</code> has on its own, but requires the coder to invoke it. If you&#8217;re only
applying one filter, you don&#8217;t need <code>.chain()</code> or <code>.value()</code>.</p>

<p>In underscore.as, <code>select</code> is a synonym for <code>filter</code>. I prefer it, since I think
it better reflects what the method really does: it selects only certain elements
from the original list.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 04 */</span>
</span><span class='line'><span class="cm">/** Filter builder: selects within rectangle. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">withinBounds</span><span class="p">(</span><span class="nx">bounds</span><span class="o">:</span><span class="nb">Rectangle</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">bounds</span><span class="p">.</span><span class="nx">containsPoint</span><span class="p">(</span><span class="k">new</span> <span class="nb">Point</span><span class="p">(</span><span class="nx">alien</span><span class="p">.</span><span class="nx">x</span><span class="o">,</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">y</span><span class="p">));</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/** Filter builder: selects on weapon type. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">hasWeapon</span><span class="p">(</span><span class="nx">weaponType</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">weapon</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="nx">weaponType</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/** Filter builder: selects aliens of a minimum level. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">minLevel</span><span class="p">(</span><span class="nx">level</span><span class="o">:</span><span class="nb">int</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">level</span> <span class="o">&gt;=</span> <span class="nx">level</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">grenadiers</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">aliens</span><span class="p">).</span><span class="nx">chain</span><span class="p">()</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">withinBounds</span><span class="p">(</span><span class="k">new</span> <span class="nb">Rectangle</span><span class="p">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">800</span><span class="o">,</span> <span class="mi">600</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">hasWeapon</span><span class="p">(</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">PLASMA_LAUNCHER</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">value</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">eliteRaiders</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">aliens</span><span class="p">).</span><span class="nx">chain</span><span class="p">()</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">withinBounds</span><span class="p">(</span><span class="nx">gameArea</span><span class="p">.</span><span class="nx">getBounds</span><span class="p">(</span><span class="nx">stage</span><span class="p">)))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">hasWeapon</span><span class="p">(</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">SHOCK_RIFLE</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">minLevel</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">value</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>withinBounds</code>, <code>hasWeapon</code>, and <code>minLevel</code> are not filter functions; they
create filter functions on demand, each suited for a specific purpose. Combined
with the inherent chaining capability of <code>Array.filter</code>, parameterized filters
make it easy to mix and match filtering operations.</p>

<p>Although underscore.as requires an explicit <code>chain</code> call at the start of a
method chain, it also permits more operations than just <code>Array.filter</code>,
<code>Array.map</code>, and <code>Array.forEach</code>. For example, <code>_.pluck</code> returns the value of
the named property for each element in the target array. Here is a trivial
example.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 05 */</span>
</span><span class='line'><span class="k">var</span> <span class="nx">cities</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>  <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;New York&quot;</span><span class="o">,</span> <span class="nx">state</span><span class="o">:</span> <span class="s2">&quot;NY&quot;</span><span class="p">}</span><span class="o">,</span>
</span><span class='line'>  <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Houston&quot;</span><span class="o">,</span> <span class="nx">state</span><span class="o">:</span> <span class="s2">&quot;TX&quot;</span><span class="p">}</span><span class="o">,</span>
</span><span class='line'>  <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Seattle&quot;</span><span class="o">,</span> <span class="nx">state</span><span class="o">:</span> <span class="s2">&quot;OR&quot;</span><span class="p">}</span>
</span><span class='line'><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">states</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">cities</span><span class="p">).</span><span class="nx">pluck</span><span class="p">(</span><span class="s2">&quot;state&quot;</span><span class="p">);</span>
</span><span class='line'><span class="c1">// results in [&quot;NY&quot;, &quot;TX&quot;, &quot;OR&quot;]</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here&#8217;s an application to our alien situation.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 06 */</span>
</span><span class='line'><span class="c1">// filter functions for underscore.as can be simpler. One example:</span>
</span><span class='line'><span class="cm">/** Filter builder: selects Aliens by weapon type. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">hasWeapon</span><span class="p">(</span><span class="nx">weaponType</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">weapon</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="nx">weaponType</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/** Filter builder: selects Weapons by percentage of ammo remaining. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">maxAmmo</span><span class="p">(</span><span class="nx">percentage</span><span class="o">:</span><span class="nb">Number</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">weapon</span><span class="o">:</span><span class="nx">Weapon</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">weapon</span><span class="p">.</span><span class="nx">ammoCount</span> <span class="o">/</span> <span class="nx">weapon</span><span class="p">.</span><span class="nx">ammoMax</span> <span class="o">&lt;</span> <span class="nx">percentage</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// here&#39;s a sequence that uses _.pluck to go down a level midstream.</span>
</span><span class='line'><span class="k">var</span> <span class="nx">grenadeLaunchers</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">aliens</span><span class="p">).</span><span class="nx">chain</span><span class="p">()</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">withinBounds</span><span class="p">(</span><span class="nx">gameArea</span><span class="p">.</span><span class="nx">getBounds</span><span class="p">(</span><span class="nx">stage</span><span class="p">)))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">hasWeapon</span><span class="p">(</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">PLASMA_LAUNCHER</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">pluck</span><span class="p">(</span><span class="s2">&quot;weapon&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">maxAmmo</span><span class="p">(</span><span class="mf">0.2</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="k">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">w</span><span class="o">:</span><span class="nx">Weapon</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">w</span><span class="p">.</span><span class="nx">reload</span><span class="p">();</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, <code>_.select</code> and <code>_.pluck</code> make it easy to extract specific values
from a multi-layered data structure and then do something to them. This style of
element selection may already be familiar to you from libraries like
<a href="http://www.jquery.com">jQuery</a>.</p>

<h2>Smarter Filters</h2>

<p>It&#8217;s handy to create a special-purpose filter function on the spot, but once
created, that function always has the same effect. Closures can do more than
that. Here&#8217;s a filter function which filters out duplicate values, by storing an
array of known elements.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 07 */</span>
</span><span class='line'><span class="kd">import</span> <span class="nx">flash</span><span class="p">.</span><span class="nx">utils</span><span class="p">.</span><span class="nb">Dictionary</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">unique</span><span class="p">()</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">known</span><span class="o">:</span><span class="nb">Dictionary</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Dictionary</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">element</span><span class="o">:*</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">known</span><span class="p">[</span><span class="nx">element</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">known</span><span class="p">[</span><span class="nx">element</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span> <span class="c1">// any value will do</span>
</span><span class='line'>      <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">list</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="p">];</span>
</span><span class='line'><span class="k">var</span> <span class="nx">uniques</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">list</span><span class="p">).</span><span class="nx">unique</span><span class="p">();</span> <span class="c1">// [1, 2, 3]</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>unique</code> function defines a <code>Dictionary</code> whose keys will be the objects
which have been passed into it so far. The values don&#8217;t matter: the point of the
<code>Dictionary</code> class is that it can have any object as a key, not just a string.
As a pleasant side effect, we can use dictionaries to simulate the <code>Set</code> class
in Java: a bag of unique values, nothing more or less. If we had stored known
values in an <code>Array</code>, even detecting if an element is <em>in</em> the array at all
would require us to compare the target element with every element in the array,
at worst&#8212;and the worst would happen every time the uniqueness filter
encountered a brand new element. With <code>Dictionary</code>, we do exactly one check for
each incoming element.</p>

<p>If it&#8217;s not clear how the function is storing and using the <code>known</code> variable,
here&#8217;s a simpler use of the same concept:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 08 */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">buildAccumulator</span><span class="p">(</span><span class="nx">startingValue</span><span class="o">:</span><span class="nb">Number</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">total</span><span class="o">:</span><span class="nb">Number</span> <span class="o">=</span> <span class="nx">startingValue</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="o">:</span><span class="nb">Number</span><span class="p">)</span><span class="o">:</span><span class="nb">Number</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">total</span> <span class="o">+=</span> <span class="nx">n</span><span class="o">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">total</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">runningTotal</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="nx">buildAccumulator</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="k">var</span> <span class="nx">expenditures</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>  <span class="nx">runningTotal</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span><span class="o">,</span>
</span><span class='line'>  <span class="nx">runningTotal</span><span class="p">(</span><span class="mi">24</span><span class="p">)</span><span class="o">,</span>
</span><span class='line'>  <span class="nx">runningTotal</span><span class="p">(</span><span class="mi">29</span><span class="p">)</span><span class="o">,</span>
</span><span class='line'>  <span class="nx">runningTotal</span><span class="p">(</span><span class="mi">22</span><span class="p">)</span>
</span><span class='line'><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// expenditures is now [20, 44, 73, 95]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Each time <code>runningTotal</code> is called, it adds the argument to its internal <code>total</code>
variable and then returns the new value of <code>total</code>. The function will retain a
reference to that variable for as long as it exists.</p>

<p>To apply this concept to our game, let&#8217;s grab aliens with a combined experience
level not to exceed 20, with individual level 3 or higher, and at least
80% health remaining.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 09 */</span>
</span><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Filter builder: selects Aliens until their combined level equals or</span>
</span><span class='line'><span class="cm"> * exceeds levelCap.</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">combinedLevel</span><span class="p">(</span><span class="nx">levelCap</span><span class="o">:</span><span class="nb">int</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">total</span><span class="o">:</span><span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">total</span> <span class="o">+=</span> <span class="nx">alien</span><span class="p">.</span><span class="nx">level</span><span class="o">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">total</span> <span class="o">&lt;=</span> <span class="nx">levelCap</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// the minLevel and minHealthPercentage filters should be obvious</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">squad</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">aliens</span><span class="p">).</span><span class="nx">chain</span><span class="p">()</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">minLevel</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">minHealthPercentage</span><span class="p">(</span><span class="mf">0.8</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">combinedLevel</span><span class="p">(</span><span class="mi">20</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">value</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Filter Creator Creators</h2>

<p>At the risk of sounding like the infamous Java <code>FactoryFactory</code>, we&#8217;ll go one
layer deeper. We&#8217;ve been making some filter builders which are quite similar &#8211;
they just operate on different attributes. So why repeat ourselves?</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 10 */</span>
</span><span class='line'><span class="cm">/** Filter builder builder: for a minimum numeric property. */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">minFilter</span><span class="p">(</span><span class="nx">property</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">minValue</span><span class="o">:</span><span class="nb">Number</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">object</span><span class="o">:*</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">object</span><span class="p">[</span><span class="nx">property</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="nx">minValue</span><span class="o">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">filters</span><span class="o">:</span><span class="nb">Object</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">minLevel</span><span class="o">:</span> <span class="nx">minFilter</span><span class="p">(</span><span class="s2">&quot;level&quot;</span><span class="p">)</span><span class="o">,</span>
</span><span class='line'>  <span class="nx">minHealth</span><span class="o">:</span> <span class="nx">minFilter</span><span class="p">(</span><span class="s2">&quot;health&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>For a certain type of person, a mere filter creator creator is peanuts. Why just
filter our lists? Why not change them into something completely different? But
personally, that&#8217;s where I draw the line; I recoil from the brink; I carefully
and quietly put the laptop down, close it with a gentle click, and go out and
enjoy the nice weather. <em>Ha ha ha!</em> Just kidding!</p>

<h2>List Transformation</h2>

<p>Meet <code>Array.map</code>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 11 */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">louder</span><span class="p">(</span><span class="nx">s</span><span class="o">:</span><span class="nb">String</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">String</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">s</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">words</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;correct&quot;</span><span class="o">,</span> <span class="s2">&quot;horse&quot;</span><span class="o">,</span> <span class="s2">&quot;battery&quot;</span><span class="o">,</span> <span class="s2">&quot;staple&quot;</span><span class="p">];</span>
</span><span class='line'><span class="nf">trace</span><span class="p">(</span><span class="nx">words</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">louder</span><span class="p">).</span><span class="nx">join</span><span class="p">());</span> <span class="c1">// CORRECT HORSE BATTERY STAPLE</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// like Array.filter, Array.map functions require three arguments</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">multiplyBy</span><span class="p">(</span><span class="nx">n</span><span class="o">:</span><span class="nb">Number</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">m</span><span class="o">:</span><span class="nb">Number</span><span class="p">)</span><span class="o">:</span><span class="nb">Number</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">n</span> <span class="o">*</span> <span class="nx">m</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">numbers</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span class="p">];</span>
</span><span class='line'><span class="k">var</span> <span class="nx">doubled</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">numbers</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">multiplyBy</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span> <span class="c1">// 2, 4, 6, 8</span>
</span></code></pre></td></tr></table></div></figure>


<p>While <code>filter</code> returns a <code>Boolean</code> to narrow down an existing list, <code>map</code>
creates a new list, by executing a function on every element of the first list.
An example from our game:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 12 */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">bestWeapon</span><span class="p">()</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="p">)</span><span class="o">:</span><span class="nx">Weapon</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">switch</span> <span class="p">(</span><span class="nx">alien</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// we don&#39;t need break statements since each case returns</span>
</span><span class='line'>      <span class="k">case</span> <span class="s2">&quot;soldier&quot;</span><span class="o">:</span> <span class="k">return</span> <span class="k">new</span> <span class="nx">Weapon</span><span class="p">(</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">SHOCK_RIFLE</span><span class="p">);</span>
</span><span class='line'>      <span class="k">case</span> <span class="s2">&quot;sniper&quot;</span><span class="o">:</span> <span class="k">return</span> <span class="k">new</span> <span class="nx">Weapon</span><span class="p">(</span><span class="nx">Weapon</span><span class="p">.</span><span class="nx">GAUSS_RIFLE</span><span class="p">);</span>
</span><span class='line'>      <span class="c1">// ...other cases</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">weapons</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">aliens</span><span class="p">).</span><span class="nx">map</span><span class="p">(</span><span class="nx">bestWeapon</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">_</span><span class="p">(</span><span class="nx">aliens</span><span class="p">).</span><span class="nx">chain</span><span class="p">().</span><span class="nx">zip</span><span class="p">(</span><span class="nx">weapons</span><span class="p">).</span><span class="k">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">pair</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// each pair is an [alien, weapon] array</span>
</span><span class='line'>  <span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">weapon</span> <span class="o">=</span> <span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>In underscore.as, <code>_.zip</code> combines two arrays A and B into an array of pairs:
<code>_([1, 2, 3]).zip("a", "b", "c")</code> results in <code>[[1, "a"], [2, "b"], [3, "c"]]</code>.
Think of the values as teeth of a zipper. When you have two arrays whose
elements belong together, in the same order&#8212;like our array of aliens and our
array of weapons for them&#8212;<code>_.zip</code> is the tool to use.</p>

<p>We call a function to get our best-weapon mapping function, because we <em>always</em>
want to create a new function. It&#8217;s a matter of style: would you rather remember
that some maps and filters are used with <code>filter(myFilter)</code> and others are
<code>filter(myFilter())</code>? Or would you rather just call them the same way all the
time? Some filters, like the unique-element filter used above, <em>have</em> to be
created anew each time they&#8217;re used. So for consistency, we&#8217;ll do this with all
of them.</p>

<h2>Smart Maps and Smarter Maps</h2>

<p>Just like filters, we can build mapping functions to perform particular actions.
Check out how <code>withAmmoType</code> creates a new array, sure, but all the elements are
the same&#8212;just with one property changed.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 13 */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">withAmmoType</span><span class="p">(</span><span class="nx">ammoType</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">weapon</span><span class="o">:</span><span class="nx">Weapon</span><span class="p">)</span><span class="o">:</span><span class="nx">Weapon</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">weapon</span><span class="p">.</span><span class="nx">ammoType</span> <span class="o">=</span> <span class="nx">ammoType</span><span class="o">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">weapon</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">weapons</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">aliens</span><span class="p">).</span><span class="nx">chain</span><span class="p">()</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">bestWeapon</span><span class="p">())</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">withAmmoType</span><span class="p">(</span><span class="nx">Ammo</span><span class="p">.</span><span class="nx">ARMOR_PIERCING</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">value</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">_</span><span class="p">(</span><span class="nx">aliens</span><span class="p">).</span><span class="k">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="o">,</span> <span class="nx">index</span><span class="o">:</span><span class="nb">int</span><span class="p">)</span><span class="o">:</span><span class="nx">Alien</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">alien</span><span class="p">.</span><span class="nx">weapon</span> <span class="o">=</span> <span class="nx">weapons</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way of assigning weapons to aliens may be easier to understand than the
<code>_.zip</code> version, and it demonstrates that you can use the index argument to your
filter and map functions in underscore.as&#8212;you just aren&#8217;t required to. On the
other hand, by calling <code>weapons[index]</code>, this code throws you right back into
the mindset of <code>for (var i:int = 0; i &lt; foo.length; i++)</code>&#8230; exactly the sort of
loop drudgery we want to escape. Why should we waste our time telling the
computer <em>how</em> to loop over a set of items? Why should we have to tell the
computer what <em>numbers</em> to plug into an array to get values out? With <code>_.zip</code>,
we just say &#8220;transform the data in a way that&#8217;s easy to think about.&#8221;</p>

<p>Naturally, we won&#8217;t stop there. With our <code>unique</code> function, and our squad
builders, we saw that we can build a closure which holds a running set of data.
With mapping functions, we can do considerably more.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 14 */</span>
</span><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Map builder: matches enemy difficulty to the player characters,</span>
</span><span class='line'><span class="cm"> * and makes sure enemy party has at least one of each type.</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">balance</span><span class="p">(</span><span class="nx">party</span><span class="o">:</span><span class="nx">Party</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">targetCombinedLevel</span><span class="o">:</span><span class="nb">int</span> <span class="o">=</span> <span class="nx">party</span><span class="p">.</span><span class="nx">combinedLevel</span> <span class="o">+</span> <span class="mi">5</span><span class="o">;</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">targetAverageLevel</span><span class="o">:</span><span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">var</span> <span class="nx">types</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;grenadier&quot;</span><span class="o">,</span> <span class="s2">&quot;soldier&quot;</span><span class="o">,</span> <span class="s2">&quot;sniper&quot;</span><span class="o">,</span> <span class="s2">&quot;scout&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// this time we&#39;re using all the arguments</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">alien</span><span class="o">:</span><span class="nx">Alien</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nx">Alien</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// set target average level once we know the array length</span>
</span><span class='line'>    <span class="nx">targetAverageLevel</span> <span class="o">||=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">targetCombinedLevel</span> <span class="o">/</span> <span class="nx">a</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">alien</span><span class="p">.</span><span class="nx">level</span> <span class="o">=</span> <span class="nx">targetAverageLevel</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// change the alien type until all required types are used</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">types</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">alien</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="nx">types</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">alien</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we have a function which transforms an entire list of enemies to match an
in-game requirement. The possibilities don&#8217;t stop there: we could use an inner
mapping function to convert player classes to enemy types, ensuring that each
player character is confronted with an appropriate counterattack. Or we could
add a mapping which places the aliens in a formation based on the input type, by
altering their <code>x</code> and <code>y</code> values: <code>.map(toFormation("phalanx"))</code> or something.</p>

<h2>Next Up: Function Mutation</h2>

<p>In the next post, I&#8217;ll switch gears and talk about how to modify or even replace
the behavior of functions at runtime. This opens up the ability to add
application functionality on the fly, or just to simplify your code by doing a
whole lot with just a few lines.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Understanding Closures and Context]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/03/10/understanding-closures-and-context/"/>
    <updated>2012-03-10T12:38:00-05:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/03/10/understanding-closures-and-context</id>
    <content type="html"><![CDATA[<p>In the previous post, we looked at how anonymous functions can simplify code
structure, but we skirted around their most powerful capability. An anonymous
function can hold additional data, beyond what it gets from its arguments, and
it can use that data in its work.</p>

<p>By holding extra data, an anonymous function can be custom-designed, on the fly,
to perform a specific duty; it can apply special logic it normally couldn&#8217;t have
access to; it can access application state; it can even &#8220;transform&#8221; other
functions, changing their behavior, without needing access to their internals,
through a sneaky substitution known as &#8220;wrapping&#8221;; but before we can put
closures to work, we need to understand what makes them tick.</p>

<!-- more -->


<h2>Portable Scope</h2>

<p>Let&#8217;s start with a normal, everyday function, defined in a class.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 01 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Student</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">name</span><span class="o">:</span><span class="nb">String</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">grade</span><span class="o">:</span><span class="nb">String</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">tests</span><span class="o">:</span><span class="nb">Array</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">toString</span><span class="p">()</span><span class="o">:</span><span class="nb">String</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">name</span> <span class="o">+</span> <span class="s2">&quot;, grade &quot;</span> <span class="o">+</span> <span class="nx">grade</span><span class="o">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">averageScore</span><span class="p">()</span><span class="o">:</span><span class="nb">Number</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nx">connection</span><span class="o">:</span><span class="nx">Connection</span> <span class="o">=</span> <span class="nx">Database</span><span class="p">.</span><span class="nx">getConnection</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// in real life, we&#39;d do this all in SQL, of course</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">retrieveGrade</span><span class="p">(</span><span class="nx">test</span><span class="o">:</span><span class="nx">Test</span><span class="p">)</span><span class="o">:</span><span class="nb">Number</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">connection</span><span class="p">.</span><span class="nx">getGrade</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">var</span> <span class="nx">total</span><span class="o">:</span><span class="nb">Number</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">test</span><span class="o">:</span><span class="nx">Test</span> <span class="k">in</span> <span class="nx">tests</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">total</span> <span class="o">+=</span> <span class="nx">retrieveGrade</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">total</span> <span class="o">/</span> <span class="nx">tests</span><span class="p">.</span><span class="nx">length</span><span class="o">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It should not be surprising that <code>toString</code> has access to the <code>name</code> and <code>grade</code>
variables, because those variables are defined in the same <em>scope</em> as the
<code>toString</code> function. And in <code>averageScore</code>, it should not be surprising that
<code>retrieveGrade</code> has access to <code>connection</code>, because that variable is defined in
the same scope as <code>retrieveGrade</code>. But how about this?</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 02 */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">nameGenerator</span><span class="p">()</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">names</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Squirtle&quot;</span><span class="o">,</span> <span class="s2">&quot;Bulbasaur&quot;</span><span class="o">,</span> <span class="s2">&quot;Charmander&quot;</span><span class="o">,</span> <span class="s2">&quot;Pikachu&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">var</span> <span class="nx">next</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span><span class="o">:</span><span class="nb">String</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="nx">names</span><span class="p">.</span><span class="nx">shift</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">names</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">result</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">result</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">next</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">nextName</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="nx">nameGenerator</span><span class="p">();</span>
</span><span class='line'><span class="nf">trace</span><span class="p">(</span><span class="nx">nextName</span><span class="p">());</span> <span class="c1">// Squirtle</span>
</span><span class='line'><span class="nf">trace</span><span class="p">(</span><span class="nx">nextName</span><span class="p">());</span> <span class="c1">// Bulbasaur</span>
</span></code></pre></td></tr></table></div></figure>


<p>In <code>nameGenerator</code>, the <code>names</code> array is defined; then the <code>next</code> function is
defined; then the <code>next</code> function is returned&#8230; and then the <code>names</code> array
<em>goes out of scope</em>. As far as outside code is concerned, everything that
happens within <code>nameGenerator</code> happens in a sealed environment. Variables
defined there cannot spill out of it. And this is true: but a function defined
within a function <em>takes that scope with it</em>. When the <code>next</code> function is
created, it gains access to the variables which were visible at that moment&#8230;
and keeps that access as long as it exists.</p>

<h2>A Little Context</h2>

<p>Imagine a very simple class definition:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 03 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Driver</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">id</span><span class="o">:</span><span class="nb">String</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">license</span><span class="o">:</span><span class="nx">DriversLicense</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">canLegallyDrive</span><span class="p">()</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">license</span><span class="p">.</span><span class="nx">valid</span><span class="o">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">driver</span><span class="o">:</span><span class="nx">Driver</span> <span class="o">=</span> <span class="nx">Database</span><span class="p">.</span><span class="nx">getRandomDriver</span><span class="p">();</span>
</span><span class='line'><span class="nf">trace</span><span class="p">(</span><span class="s2">&quot;License number &quot;</span> <span class="o">+</span> <span class="nx">driver</span><span class="p">.</span><span class="nx">license</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
</span><span class='line'><span class="nf">trace</span><span class="p">(</span><span class="s2">&quot;Can drive? &quot;</span> <span class="o">+</span> <span class="nx">driver</span><span class="p">.</span><span class="nx">canLegallyDrive</span><span class="p">());</span>
</span></code></pre></td></tr></table></div></figure>


<p>Outside the class definition, we need to specify <code>driver.license</code>, but within
the class definition, we can refer to the <code>license</code> variable directly. That&#8217;s
because <code>license</code> is part of the <em>context</em> in which <code>canLegallyDrive</code> executes:
that is, <code>license</code> is a property of <code>this</code>. Every single line of code which
executes in AS3 has a <code>this</code> value, even if it is never directly referenced.
Every identifier&#8212;every function name, every variable name&#8212;is a
property of <code>this</code>. As I discussed in the last post, the value of <code>this</code> will
change if the function is executed in a different scope&#8230; unless the function
is a closure. Closures take their context&#8212;their <code>this</code> value&#8212;with
them. A closure can have access to as many variables as the application
requires, and good taste permits.</p>

<p>Closures are wonderfully abusable. Just wait.</p>

<h2>Common Closure Pitfalls</h2>

<p>When working with many UI objects at once, everyone makes this error at least once.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 04 */</span>
</span><span class='line'><span class="k">var</span> <span class="nx">paintings</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">Database</span><span class="p">.</span><span class="nx">getGalleryData</span><span class="p">().</span><span class="nx">paintings</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">painting</span><span class="o">:</span><span class="nx">Painting</span> <span class="k">in</span> <span class="nx">paintings</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// PaintingButton constructor draws all UI graphics</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">paintingButton</span><span class="o">:</span><span class="nx">Button</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PaintingButton</span><span class="p">(</span><span class="nx">painting</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">paintingButton</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">MouseEvent</span><span class="p">.</span><span class="nx">CLICK</span><span class="o">,</span>
</span><span class='line'>    <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">showPainting</span><span class="p">(</span><span class="nx">paintingButton</span><span class="p">.</span><span class="nx">painting</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looks straightforward, right? But when you run it, you&#8217;ll find that it always
acts as though you clicked on the last button in the list. This code creates a
separate handler function for each button, but each function is created in the
same scope; it has the same context; its <code>this</code> value is the same; and so each
function has a reference to the same <code>paintingButton</code> variable. A <em>reference</em> to
the variable, not a copy of its value. As the loop continues, the value of
<code>paintingButton</code> changes; and whenever any of the handler functions are called,
they access the <em>current</em> value of <code>paintingButton</code>.</p>

<p>There are two ways to handle this situation. If you want to use anonymous
functions, you will need to create an intermediate variable for each one, like
this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 05 */</span>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">painting</span><span class="o">:</span><span class="nx">Painting</span> <span class="k">in</span> <span class="nx">paintings</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">paintingButton</span><span class="o">:</span><span class="nx">Button</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PaintingButton</span><span class="p">(</span><span class="nx">painting</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">paintingButton</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">MouseEvent</span><span class="p">.</span><span class="nx">CLICK</span><span class="o">,</span>
</span><span class='line'>    <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">paintingButton</span><span class="o">:</span><span class="nx">PaintingButton</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">showPainting</span><span class="p">(</span><span class="nx">paintingButton</span><span class="p">.</span><span class="nx">painting</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">)(</span><span class="nx">paintingButton</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>If this looks crazy to you, you&#8217;re not alone. I would not put this in production
code, just because it&#8217;s a really odd construction. But understanding it is
crucial to understanding closures. Let&#8217;s break it down a step at a time:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 06 */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">createHandler</span><span class="p">(</span><span class="nx">paintingButton</span><span class="o">:</span><span class="nx">PaintingButton</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">handler</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">showPainting</span><span class="p">(</span><span class="nx">paintingButton</span><span class="p">.</span><span class="nx">painting</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">handler</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is a function which takes a <code>PaintingButton</code> argument, and returns an
anonymous function which holds a reference to the argument variable. Here&#8217;s the
critical part: when we call <code>createHandler(monaLisaButton)</code>&#8212;that is, we
call <code>createHandler</code> with a specific <code>PaintingButton</code>&#8212;the argument is
assigned to the argument variable <code>paintingButton</code> for as long as
<code>createHandler</code> continues to execute. That argument variable is not the same
variable as <code>monaLisaButton</code>. When the inner function, <code>handler</code>, is created, it
holds a reference to <code>paintingButton</code>, whose value has been set to the argument.
It keeps that reference&#8230; even though <code>createHandler</code> completes and the
argument variable otherwise goes out of scope. Since each invocation of
<code>createHandler</code> creates a new short-lived argument variable, each function
returned from <code>createHandler</code> has a different context&#8212;a different
<code>this</code>&#8212;and thus a different <code>paintingButton</code> variable which can hold a
different value.</p>

<p>Armed with that knowledge, this code should make a little more sense:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 07 */</span>
</span><span class='line'><span class="k">var</span> <span class="nx">monaLisaButton</span><span class="o">:</span><span class="nx">PaintingButton</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PaintingButton</span><span class="p">(</span><span class="nx">monaLisa</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">handler</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">paintingButton</span><span class="o">:</span><span class="nx">PaintingButton</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">showPainting</span><span class="p">(</span><span class="nx">paintingButton</span><span class="p">.</span><span class="nx">painting</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">})(</span><span class="nx">monaLisaButton</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">monaLisaButton</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">MouseEvent</span><span class="p">.</span><span class="nx">CLICK</span><span class="o">,</span> <span class="nx">handler</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The value of <code>handler</code> is derived by declaring a function literal and
immediately executing it. We don&#8217;t store the function; we just invoke it
instantly, by tacking <code>(monaLisaButton)</code> on right after the function literal.
The parentheses around the function literal are not necessary; they&#8217;re just a
reminder to consider the function literal as an expression to be evaluated.
These two constructions are equivalent:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 08 */</span>
</span><span class='line'><span class="k">var</span> <span class="nx">one</span><span class="o">:</span><span class="nb">int</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span><span class="o">:</span><span class="nb">int</span> <span class="p">{</span><span class="k">return</span> <span class="mi">1</span><span class="o">;</span><span class="p">}();</span> <span class="c1">// execute immediately</span>
</span><span class='line'><span class="k">var</span> <span class="nx">two</span><span class="o">:</span><span class="nb">int</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span><span class="o">:</span><span class="nb">int</span> <span class="p">{</span><span class="k">return</span> <span class="mi">2</span><span class="o">;</span><span class="p">})();</span> <span class="c1">// a bit clearer?</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should be able to understand exactly why figure 05 works now, but in
practice, it&#8217;s a clear-cut case of &#8220;closure abuse&#8221;. Here&#8217;s a better approach:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 09 */</span>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">painting</span><span class="o">:</span><span class="nx">Painting</span> <span class="k">in</span> <span class="nx">paintings</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">var</span> <span class="nx">paintingButton</span><span class="o">:</span><span class="nx">Button</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PaintingButton</span><span class="p">(</span><span class="nx">painting</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">paintingButton</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">MouseEvent</span><span class="p">.</span><span class="nx">CLICK</span><span class="o">,</span>
</span><span class='line'>    <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">showPainting</span><span class="p">(</span><span class="nx">PaintingButton</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">currentTarget</span><span class="p">).</span><span class="nx">painting</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Much more pragmatic, much easier to think about. Like any programming tool,
closures should only be used where the benefits are worth the extra effort.</p>

<h2>Function Binding</h2>

<p>As discussed in the previous post, anonymous functions normally execute in the
context in which they are called, not the context in which they are defined.
True enough&#8212;unless you &#8220;bind&#8221; the functions. Here&#8217;s the original example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 10 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Foo</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">name</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;Foo&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">sayName</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nf">trace</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">name</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;Bar&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">sayName</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">foo</span><span class="o">:</span><span class="nx">Foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Foo</span><span class="p">();</span>
</span><span class='line'><span class="k">var</span> <span class="nx">bar</span><span class="o">:</span><span class="nx">Bar</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Bar</span><span class="p">();</span>
</span><span class='line'><span class="nx">bar</span><span class="p">.</span><span class="nx">sayName</span> <span class="o">=</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">sayName</span><span class="o">;</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">sayName</span><span class="p">();</span> <span class="c1">// traces &quot;Foo&quot;</span>
</span><span class='line'><span class="nx">bar</span><span class="p">.</span><span class="nx">sayName</span><span class="p">();</span> <span class="c1">// traces &quot;Bar&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here&#8217;s one in which the <code>sayName</code> function is bound to the instance of
<code>Foo</code>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Foo</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">name</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;Foo&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">sayName</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="nx">bind</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nf">trace</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">private</span> <span class="kd">function</span> <span class="nx">bind</span><span class="p">(</span><span class="nx">f</span><span class="o">:</span><span class="nb">Function</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nx">self</span><span class="o">:</span><span class="nx">Foo</span> <span class="o">=</span> <span class="k">this</span><span class="o">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="kd">function</span><span class="p">(...</span><span class="nx">args</span><span class="p">)</span><span class="o">:*</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">f</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">self</span><span class="o">,</span> <span class="nx">args</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">name</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;Bar&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">sayName</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">foo</span><span class="o">:</span><span class="nx">Foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Foo</span><span class="p">();</span>
</span><span class='line'><span class="k">var</span> <span class="nx">bar</span><span class="o">:</span><span class="nx">Bar</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Bar</span><span class="p">();</span>
</span><span class='line'><span class="nx">bar</span><span class="p">.</span><span class="nx">sayName</span> <span class="o">=</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">sayName</span><span class="o">;</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">sayName</span><span class="p">();</span> <span class="c1">// traces &quot;Foo&quot;</span>
</span><span class='line'><span class="nx">bar</span><span class="p">.</span><span class="nx">sayName</span><span class="p">();</span> <span class="c1">// also traces &quot;Foo&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Every function is an instance of <code>Function</code>; and <code>Function</code> has two methods,
<code>call</code> and <code>apply</code>. They&#8217;re both similar in that they let the user specify the
value of <code>this</code> for a specific invocation of the function. <code>Foo.bind</code> returns a
function&#8212;a closure&#8212;which <em>always</em> calls the supplied method with the
value of <code>this</code> at the time <code>bind</code> was executed. By making <code>this</code> immutable, it
makes it safe to pass the function around without changing its behavior.</p>

<p>This is exactly what the <code>function</code> keyword does, quietly and modestly, whenever
you compile a SWF. To get the same behavior much more easily, simply do this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 12 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Foo</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">name</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;Foo&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">sayName</span><span class="p">()</span><span class="o">:</span><span class="nb">String</span> <span class="p">{</span>
</span><span class='line'>    <span class="nf">trace</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Honestly, function binding <em>per se</em> won&#8217;t come up very much in AS3. Most
functions are defined within classes, or can take advantage of normal scope
rules and the closure mechanism to maintain access to the variables they need.
But the core idea of a function which <em>transforms</em> other functions will come up
time and again, not only in AS3 but in JavaScript, Ruby, Python, and other
languages.</p>

<h2>The Potential of Closures</h2>

<p>In the next post, we&#8217;ll put closures to work, from simple list manipulation to
rewriting application behavior on the fly; and with any luck, you will begin to
see just what potential lies buried within these concepts.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Anonymous Functions in AS3]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/03/10/anonymous-functions-in-as3/"/>
    <updated>2012-03-10T12:37:00-05:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/03/10/anonymous-functions-in-as3</id>
    <content type="html"><![CDATA[<p>In ActionScript, functions are objects which can be stored in variables and
passed as arguments, just like any other value. Since functions are treated just
like any other object&#8212;like &#8220;first-class citizens,&#8221; if you will&#8212;AS3
is said to have &#8220;first-class functions.&#8221; This lets us do stuff that would be
cumbersome in other languages, but it also throws a whole new set of potholes in
our path. This post shows how to use first-class functions for state-based event
handling, user input interpretation, and array filtering, but I&#8217;ll begin with
something you&#8217;ve seen a million times before: the lowly event listener.</p>

<!-- more -->


<h2>Anonymous Functions</h2>

<p>This syntax appears constantly in ActionScript:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 01 */</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">handleChange</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">doStuff</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">thing</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">Event</span><span class="p">.</span><span class="nx">CHANGE</span><span class="o">,</span> <span class="nx">handleChange</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// which is equivalent to this:</span>
</span><span class='line'><span class="nx">thing</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">Event</span><span class="p">.</span><span class="nx">CHANGE</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">doStuff</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Both syntaxes have the same effect: they create a function and register it to be
executed whenever the <code>thing</code> object fires a <code>CHANGE</code> event. In the first
example, the function gets a name; in the second, it has no name: it is
&#8220;anonymous.&#8221; Here is an anonymous function:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 02 */</span>
</span><span class='line'><span class="k">var</span> <span class="nx">alpha</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span><span class="nf">trace</span><span class="p">(</span><span class="s2">&quot;alpha&quot;</span><span class="p">);};</span>
</span><span class='line'><span class="nx">alpha</span><span class="p">();</span> <span class="c1">// traces &quot;alpha&quot;</span>
</span><span class='line'><span class="k">var</span> <span class="nx">beta</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="nx">alpha</span><span class="o">;</span>
</span><span class='line'><span class="nx">beta</span><span class="p">();</span> <span class="c1">// traces &quot;alpha&quot;, since it&#39;s the exact same function</span>
</span></code></pre></td></tr></table></div></figure>


<p>The value assigned to <code>alpha</code> is a &#8220;function literal&#8221;. Just like a string
literal is converted to a String object at runtime, and a regex literal is
converted to a <code>RegExp</code>, a function literal is converted to a <code>Function</code>. It&#8217;s
an instance of the <code>Function</code> class. You must understand that the <code>function</code>
keyword in AS3 is almost identical to just assigning a anonymous function to a
variable.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 03 */</span>
</span><span class='line'><span class="c1">// has the same effect as the code in figure 02</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">alpha</span><span class="p">()</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>  <span class="nf">trace</span><span class="p">(</span><span class="s2">&quot;alpha&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">alpha</span><span class="p">();</span>
</span><span class='line'><span class="k">var</span> <span class="nx">beta</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="nx">alpha</span><span class="o">;</span>
</span><span class='line'><span class="nx">beta</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are two subtle differences between functions defined using the <code>function</code>
keyword and functions which are stored in variables, arrays, or objects. One
concerns the behavior of the <code>this</code> keyword, and will be explained later. The
other is that variables defined using <code>function</code> are &#8220;hoisted&#8221; to the top of the
script, and interpreted first, so that they are available to all code in the
same scope. Anonymous functions follow the same rules as any other object: you
have to define them before you can use them.</p>

<p>From this point on, any function which is <em>not</em> defined using the <code>function</code>
keyword, whether it is assigned to a variable or not, will be referred to as an
&#8220;anonymous function.&#8221;</p>

<h2>Normal Event Listeners</h2>

<p>Armed with this knowledge, you can guess how <code>EventDispatcher.addEventListener</code>
works. Given an event type and a function, it adds the function to an array of
functions to be called whenever an event of that type occurs. In fact, here&#8217;s a
naive implementation:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 03 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nb">EventDispatcher</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">private</span> <span class="k">var</span> <span class="nx">listeners</span><span class="o">:</span><span class="nb">Object</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">   * Registers the handler to be executed when an event of the supplied</span>
</span><span class='line'><span class="cm">   * type occurs.</span>
</span><span class='line'><span class="cm">   */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">addEventListener</span><span class="p">(</span><span class="nx">type</span><span class="o">:</span><span class="nb">String</span><span class="o">,</span> <span class="nx">handler</span><span class="o">:</span><span class="nb">Function</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">listeners</span><span class="p">[</span><span class="nx">type</span><span class="p">]</span> <span class="o">||=</span> <span class="p">[];</span>
</span><span class='line'>    <span class="nx">listeners</span><span class="p">[</span><span class="nx">type</span><span class="p">].</span><span class="nx">push</span><span class="p">(</span><span class="nx">handler</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/**</span>
</span><span class='line'><span class="cm">   * Signals that an event of the supplied type has occurred. Calls</span>
</span><span class='line'><span class="cm">   * all handlers, passing each one the event as an argument.</span>
</span><span class='line'><span class="cm">   */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">dispatchEvent</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">handler</span><span class="o">:</span><span class="nb">Function</span> <span class="k">in</span> <span class="nx">listeners</span><span class="p">[</span><span class="nx">type</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// though we passed it around as a value, it&#39;s still</span>
</span><span class='line'>      <span class="c1">// a function... and we can call it as one with &quot;()&quot;.</span>
</span><span class='line'>      <span class="nx">handler</span><span class="p">(</span><span class="nx">event</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the for-each loop, we have a variable named <code>handler</code>, which is assigned an
anonymous function as its value. As long as the value of a variable is an
instance of <code>Function</code>, we can invoke it with &#8220;()&#8221;, just like any other
function.</p>

<p>This simple example doesn&#8217;t prevent duplicate handlers, and has no way of
removing handlers, but it&#8217;s a general outline of what Flash Player is doing
under the hood; and it would be impossible without anonymous functions.</p>

<h2>State-based Event Listeners</h2>

<p>You might already have implemented input states by using switch statements, sort
of like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 04 */</span>
</span><span class='line'><span class="kd">private</span> <span class="kd">function</span> <span class="nx">handleClick</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">switch</span> <span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">case</span> <span class="nx">INPUT</span><span class="o">:</span>
</span><span class='line'>      <span class="c1">// behavior of click event while in input state</span>
</span><span class='line'>      <span class="k">break</span><span class="o">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nx">LOADING</span><span class="o">:</span>
</span><span class='line'>      <span class="c1">// behavior of click event while in loading state</span>
</span><span class='line'>      <span class="k">break</span><span class="o">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nx">VIEW</span><span class="o">:</span>
</span><span class='line'>      <span class="c1">// behavior of click event while in view state</span>
</span><span class='line'>      <span class="k">break</span><span class="o">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">private</span> <span class="kd">function</span> <span class="nx">handleClick</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">switch</span> <span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">case</span> <span class="nx">INPUT</span><span class="o">:</span>
</span><span class='line'>      <span class="c1">// behavior of move event while in input state</span>
</span><span class='line'>      <span class="k">break</span><span class="o">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nx">LOADING</span><span class="o">:</span>
</span><span class='line'>      <span class="c1">// behavior of move event while in loading state</span>
</span><span class='line'>      <span class="k">break</span><span class="o">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nx">VIEW</span><span class="o">:</span>
</span><span class='line'>      <span class="c1">// behavior of move event while in view state</span>
</span><span class='line'>      <span class="k">break</span><span class="o">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>But in this approach, you have three possible behaviors defined for each event
handler, resulting in code clutter: if you&#8217;re only interested in the view state,
you have to skip past the other states to find it. A different approach is to
change your event handlers only once when the state changes; and although you
could define functions with names like <code>readyStateClickHandler</code>, it&#8217;s
more flexible to map event handlers to state constants. Here&#8217;s an example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 05 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">InputHandler</span> <span class="p">{</span>
</span><span class='line'>  <span class="cm">/* state constants */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">const</span> <span class="nx">INPUT</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;input&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">const</span> <span class="nx">LOADING</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;loading&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">const</span> <span class="nx">VIEW</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;view&quot;</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/* stores current value of &quot;this&quot; */</span>
</span><span class='line'>  <span class="kd">private</span> <span class="k">var</span> <span class="nx">self</span><span class="o">:</span><span class="nx">InputHandler</span> <span class="o">=</span> <span class="k">this</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/* input handlers */</span>
</span><span class='line'>  <span class="kd">private</span> <span class="k">var</span> <span class="nx">handlers</span><span class="o">:</span><span class="nb">Object</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">input</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">click</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// click handler for input state</span>
</span><span class='line'>      <span class="p">}</span><span class="o">,</span>
</span><span class='line'>      <span class="nx">move</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// mouse move handler for input state</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span><span class="o">,</span>
</span><span class='line'>    <span class="nx">loading</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">click</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// click handler for loading state</span>
</span><span class='line'>      <span class="p">}</span><span class="o">,</span>
</span><span class='line'>      <span class="nx">move</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// mouse move handler for loading state</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span><span class="o">,</span>
</span><span class='line'>    <span class="nx">view</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">click</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// click handler for view state</span>
</span><span class='line'>      <span class="p">}</span><span class="o">,</span>
</span><span class='line'>      <span class="nx">move</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// mouse move handler for view state</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">private</span> <span class="k">var</span> <span class="nx">_state</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;input&quot;</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="kd">get</span> <span class="nx">state</span><span class="p">()</span><span class="o">:</span><span class="nb">String</span> <span class="p">{</span><span class="k">return</span> <span class="nx">_state</span><span class="o">;</span><span class="p">}</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="kd">set</span> <span class="nx">state</span><span class="p">(</span><span class="nx">value</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">_state</span> <span class="o">!=</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// replace click handler</span>
</span><span class='line'>      <span class="nx">removeEventListener</span><span class="p">(</span><span class="nb">MouseEvent</span><span class="p">.</span><span class="nx">CLICK</span><span class="o">,</span> <span class="nx">handlers</span><span class="p">[</span><span class="nx">state</span><span class="p">].</span><span class="nx">click</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">addEventListener</span><span class="p">(</span><span class="nb">MouseEvent</span><span class="p">.</span><span class="nx">CLICK</span><span class="o">,</span> <span class="nx">handlers</span><span class="p">[</span><span class="nx">value</span><span class="p">].</span><span class="nx">click</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">_state</span> <span class="o">=</span> <span class="nx">value</span><span class="o">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this system, we can define all our event handlers in the handlers object,
grouped by state; it&#8217;s easier to work on the behavior for one state at a time.
Of course, for even more modularity, we could implement the classic
<a href="http://en.wikipedia.org/wiki/State_pattern">State pattern</a>.</p>

<h2>Anonymous functions and <code>this</code></h2>

<p>You probably noticed a quirk: the <code>self</code> variable defined right before the input
handlers. This is a workaround for one of the pitfalls of anonymous functions:
functions which are <em>not</em> created with the <code>function</code> keyword do not have a
single permanent <code>this</code> value. Instead, <code>this</code> is always equal to the context in
which the function is called. An example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 06 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Foo</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">name</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;Foo&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">sayName</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nf">trace</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Bar</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">name</span><span class="o">:</span><span class="nb">String</span> <span class="o">=</span> <span class="s2">&quot;Bar&quot;</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">sayName</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">foo</span><span class="o">:</span><span class="nx">Foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Foo</span><span class="p">();</span>
</span><span class='line'><span class="k">var</span> <span class="nx">bar</span><span class="o">:</span><span class="nx">Bar</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Bar</span><span class="p">();</span>
</span><span class='line'><span class="nx">bar</span><span class="p">.</span><span class="nx">sayName</span> <span class="o">=</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">sayName</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/* At this point, bar.sayName is the exact same Function object as</span>
</span><span class='line'><span class="cm"> * foo.sayName! But if we call it on each object in turn...</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">sayName</span><span class="p">();</span> <span class="c1">// traces &quot;foo&quot;</span>
</span><span class='line'><span class="nx">bar</span><span class="p">.</span><span class="nx">sayName</span><span class="p">();</span> <span class="c1">// traces &quot;bar&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Sometimes this is exactly the behavior you want! You might want to give an
object new methods, and give those methods the ability to access their new
&#8220;host&#8221; object&#8212;sort of like defining a class at runtime. In the example
above, when we assign <code>foo</code>&#8217;s <code>sayName</code> function to <code>bar</code>, <code>sayName</code> behaves as
if it had been defined in the <code>Bar</code> class all along.</p>

<p>But sometimes that behavior gets in your way. In fact, Adobe&#8217;s documentation
says not to use anonymous functions as event listeners at all&#8212;but that&#8217;s a
sad, dry, timid way to live. We can squeeze a lot of extra power out of
anonymous functions as long as we know three things. First, the value of <code>this</code>
can change; second, we can store the <em>current</em> value of <code>this</code> and use it later.
Within all those event handlers, just use <code>self</code> where you would normally use
<code>this</code>. I&#8217;ll explain the underlying theory in the next post.</p>

<p>The third thing? Who says you need to use <code>this</code> in event handlers in the first
place? Just refer to instance variables as you normally would, and everything
will work just fine.</p>

<h2>User input interpretation</h2>

<p>Anonymous functions also come in handy when responding to user input. Imagine a
multiplayer game with a chat window. In addition to chatting with other players,
the user can type simple commands beginning with &#8220;/&#8221;, as in IRC. We want to
provide abbreviations for advanced users, and allow permutations such as
variable arguments. Here&#8217;s an easy way to do it with regular expressions and
anonymous functions:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 07 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">Interpreter</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">private</span> <span class="k">var</span> <span class="nx">commands</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>      <span class="c1">// e.g. &quot;/h&quot;, &quot;/help&quot;</span>
</span><span class='line'>    <span class="p">{</span>   <span class="nx">pattern</span><span class="o">:</span> <span class="sr">/^\/h(elp)?$/</span><span class="o">,</span>
</span><span class='line'>      <span class="nx">command</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">input</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// display help text</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span><span class="o">,</span>
</span><span class='line'>      <span class="c1">// e.g. &quot;/w alan Hey, what&#39;s up?&quot;</span>
</span><span class='line'>    <span class="p">{</span>   <span class="nx">pattern</span><span class="o">:</span> <span class="sr">/^\/w(hisper)? (\w+) (.+)$/</span><span class="o">,</span>
</span><span class='line'>      <span class="nx">command</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">input</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// find the target user</span>
</span><span class='line'>        <span class="c1">// send a whisper to the target user</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">interpret</span><span class="p">(</span><span class="nx">input</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">mapping</span><span class="o">:</span><span class="nb">Object</span> <span class="k">in</span> <span class="nx">commands</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">input</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">mapping</span><span class="p">.</span><span class="nx">pattern</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">mapping</span><span class="p">.</span><span class="nx">handler</span><span class="p">(</span><span class="nx">input</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span><span class="o">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="c1">// if no pattern matched, display an error message</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This system makes it easy to define new input/handler pairs, and since the
handlers are defined right after the patterns that invoke them, the code is
simple to understand.</p>

<h2>Array filtering</h2>

<p>AS3 provides built-in methods for array transformation using first-class
functions: <code>filter</code> and <code>map</code>. Here&#8217;s the usage of
<code>filter</code>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 08 */</span>
</span><span class='line'><span class="cm">/** Filter function: returns true if n is a positive integer. */</span>
</span><span class='line'><span class="c1">// AS3 requires filter functions to have all three arguments</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">isNaturalNumber</span><span class="p">(</span><span class="nx">n</span><span class="o">:</span><span class="nb">Number</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">n</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="nx">n</span> <span class="o">%</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">var</span> <span class="nx">list</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="o">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mf">2.5</span><span class="o">,</span> <span class="mi">3</span><span class="p">];</span>
</span><span class='line'><span class="k">var</span> <span class="nx">naturalNumbers</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">list</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">isNaturalNumber</span><span class="p">);</span>
</span><span class='line'><span class="c1">// naturalNumbers is now [1, 3]</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>Array.filter</code> takes one argument: a function. It applies that function to each
element of the array in turn. If the function returns false, that element is not
included in the result. <code>Array.filter</code> requires the filter function to have
three arguments, but if we want the flexibility of anonymous functions, this
gets cumbersome:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 09 */</span>
</span><span class='line'><span class="k">var</span> <span class="nx">naturalNumbers</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">list</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="o">:</span><span class="nb">Number</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">n</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="nx">n</span> <span class="o">%</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://www.github.com/amacdougall/underscore.as">underscore.as</a> accepts
functions as simple as <code>function(e:*):Boolean</code>. The underlying
concept, however, is identical.</p>

<p>This approach becomes more powerful when we start to pre-define filter functions
and call them on demand. For instance, imagine a product list with filter
buttons:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 10 */</span>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nx">ProductList</span> <span class="kd">extends</span> <span class="nb">Sprite</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">private</span> <span class="k">var</span> <span class="nx">products</span><span class="o">:</span><span class="nb">Array</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// filter buttons</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">justAddedButton</span><span class="o">:</span><span class="nb">SimpleButton</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">freeShippingButton</span><span class="o">:</span><span class="nb">SimpleButton</span><span class="o">;</span>
</span><span class='line'>  <span class="kd">public</span> <span class="k">var</span> <span class="nx">closeoutButton</span><span class="o">:</span><span class="nb">SimpleButton</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">ProductList</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">products</span> <span class="o">=</span> <span class="nx">loadProductsFromDatabase</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">linkFilter</span><span class="p">(</span><span class="nx">justAddedButton</span><span class="o">,</span> <span class="nx">justAdded</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">linkFilter</span><span class="p">(</span><span class="nx">freeShippingButton</span><span class="o">,</span> <span class="nx">freeShipping</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">linkFilter</span><span class="p">(</span><span class="nx">closeoutButton</span><span class="o">,</span> <span class="nx">closeout</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/** Display the supplied product list on screen. */</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">function</span> <span class="nx">display</span><span class="p">(</span><span class="nx">productList</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// draw only these products to the screen</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/** Convenience method for hooking up filters to buttons. */</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kd">function</span> <span class="nx">linkFilter</span><span class="p">(</span><span class="nx">button</span><span class="o">:</span><span class="nb">SimpleButton</span><span class="o">,</span> <span class="nx">filter</span><span class="o">:</span><span class="nb">Function</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">button</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">MouseEvent</span><span class="p">.</span><span class="nx">CLICK</span><span class="o">,</span>
</span><span class='line'>      <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">MouseEvent</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">display</span><span class="p">(</span><span class="nx">products</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">filter</span><span class="p">));</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/** Allows only Products whose justAdded property is true. */</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kd">function</span> <span class="nx">justAdded</span><span class="p">(</span><span class="nx">p</span><span class="o">:</span><span class="nx">Product</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">p</span><span class="p">.</span><span class="nx">justAdded</span><span class="o">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/** Allows only Products whose freeShipping property is true. */</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kd">function</span> <span class="nx">freeShipping</span><span class="p">(</span><span class="nx">p</span><span class="o">:</span><span class="nx">Product</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">p</span><span class="p">.</span><span class="nx">freeShipping</span><span class="o">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/** Allows only Products whose closeout property is true. */</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kd">function</span> <span class="nx">closeout</span><span class="p">(</span><span class="nx">p</span><span class="o">:</span><span class="nx">Product</span><span class="o">,</span> <span class="nx">i</span><span class="o">:</span><span class="nb">int</span><span class="o">,</span> <span class="nx">a</span><span class="o">:</span><span class="nb">Array</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">p</span><span class="p">.</span><span class="nx">closeout</span><span class="o">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this case, although we&#8217;re passing the filter functions around as values, the
functions themselves <em>were</em> declared with the <code>function</code> keyword. This doesn&#8217;t
mean we can&#8217;t treat them as variables! It just means that for those functions,
the value of <code>this</code> is fixed for all time, and those functions are available
even before code execution reaches that point in the file.</p>

<h2>Functions with superpowers</h2>

<p>In the next post, we&#8217;ll discuss closures&#8212;anonymous functions which contain
extra data. You&#8217;ve already seen a simple closure when we used the <code>self</code>
variable to get a durable reference to <code>this</code>. But closures can do far more than
that; in fact, with closures, it is possible to create a sort of mini-language
within ActionScript 3, replacing loops and branches with terse, targeted
commands, or even changing the behavior of existing functions. This is common in
languages like Lisp or Ruby, where this type of programming is called a
Domain-Specific Language, or DSL. The popular JavaScript library jQuery can be
considered a comprehensive DSL for front-end programming; aspects of Rails can
be considered a DSL for web programming (and much more). We can tap into similar
power in ActionScript 3 if we choose.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing underscore.as]]></title>
    <link href="http://www.alanmacdougall.com//blog/2012/03/09/introducing-underscore-dot-as/"/>
    <updated>2012-03-09T00:02:00-05:00</updated>
    <id>http://www.alanmacdougall.com//blog/2012/03/09/introducing-underscore-dot-as</id>
    <content type="html"><![CDATA[<p><a href="http://www.github.com/amacdougall/underscore.as">underscore.as</a> is an
ActionScript 3.0 port of Jeremy Ashkenas&#8217;s excellent
<a href="http://documentcloud.github.com/underscore/">underscore.js</a> library. Like its
JavaScript original, underscore.as provides a quick syntax for functional
programming concepts. Unlike the original, underscore.as is not idiomatic: it
doesn&#8217;t look like the kind of ActionScript you probably write every day. You
may have to adjust your programming style to take full advantage of it. I hope
this quick introduction will explain why you should bother.</p>

<!-- more -->


<h2>ActionScript 3.0 is Java</h2>

<p>If you&#8217;re old, wrinkled, and toothless&#8212;about 35 in programmer
years&#8212;you remember the Flash 5 and ActionScript 1.0 versions of
ActionScript. They were the first ones to work like JavaScript, and despite
their many flaws, they had some useful ideas at their core: prototype-based
inheritance, mixins, anonymous functions, dynamic classes. Presented with
these new features, programmers immediately used them for evil. Not only was
code scattered wildly among dozens of timeline frames and stage instances, but
properties were added to objects willy-nilly without rhyme, reason, or
documentation. Broken function scope and an undocumented event system made
anonymous functions difficult to use as event handlers. Even the base API
presented an inconsistent mishmash of interfaces.</p>

<p>Beginning with ActionScript 2.0, the language designers began painting over
the language with an explicit class system, static type annotations, even
interfaces. Programmers could now write ActionScript as if it were Java, and
they did; but old-timers were still free to assign function objects to
<code>MovieClip.onRelease</code> to their heart&#8217;s content. But with ActionScript 3.0,
everything changed: old-timers cried bloody murder as static types, object
orientation, and addEventListener carried the day.</p>

<p>Polyglot programmers will immediately notice that most ActionScript 3.0 code
today looks a great deal like Java. This is not accidental. ActionScript 3.0 was
developed hand in hand with Flex in an attempt to woo
<a href="http://www.thedailywtf.com">enterprise developers</a>, with considerable success.
&#8220;Enterprise Flex&#8221; is definitely a thing now. But in the process, quick and easy
Flash development has gotten bogged down in boilerplate; and at the same time,
things that should have gotten easier with each language version have stayed
pretty much the same.</p>

<h2>ActionScript 3.0 is JavaScript</h2>

<p>But Adobe added one more feature with AS3: closures. I&#8217;ll explain these
mysterious beasts in detail in a later post, but for now it&#8217;s enough to say
that a closure is a special type of function which contains extra information,
beyond the arguments it is given. A closure can do things a normal function
cannot. With the addition of closures, ActionScript 3.0 gained most of the
flexibility and power of JavaScript&#8212;and if you don&#8217;t believe that
JavaScript has flexibility and power, look at what libraries like jQuery are
doing under the hood. With a little help from static initializers, language
hackery, and the &#8220;:*&#8221; type annotation, we can achieve in AS3 almost anything
we can achieve in JavaScript.</p>

<p>Through judicious use of closures, it is possible to create simple constructs
of great power, escaping the verbose Java-like syntax of AS3; or, if you
prefer, building upon the spartan simplicity of core JavaScript. Here are a
few examples of idiomatic AS3 code which can be simplified by use of
underscore.as.</p>

<h2>Modifying Collections</h2>

<p>For all the examples below, assume the following list.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 01 */</span>
</span><span class='line'><span class="k">var</span> <span class="nx">list</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>  <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Alice&quot;</span><span class="o">,</span> <span class="nx">age</span><span class="o">:</span> <span class="mi">35</span><span class="p">}</span><span class="o">,</span>
</span><span class='line'>  <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Bob&quot;</span><span class="o">,</span> <span class="nx">age</span><span class="o">:</span> <span class="mi">24</span><span class="p">}</span><span class="o">,</span>
</span><span class='line'>  <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Carol&quot;</span><span class="o">,</span> <span class="nx">age</span><span class="o">:</span> <span class="mi">31</span><span class="p">}</span>
</span><span class='line'><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>A common array filtering task: get only the array elements matching certain
criteria. Normally, this requires a loop and an results array, but with
underscore.as, the select() function prepares the results list on the fly. Using
the syntax <code>_(list).select(f)</code>, it returns a list of elements for which the
function <code>f</code> returned true.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 02 */</span>
</span><span class='line'><span class="c1">// idiomatic AS3</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">person</span><span class="o">:</span><span class="nb">Object</span> <span class="k">in</span> <span class="nx">list</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">person</span><span class="p">.</span><span class="nx">age</span> <span class="o">&gt;</span> <span class="mi">30</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">result</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">person</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">list</span><span class="p">).</span><span class="nx">select</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">person</span><span class="o">:</span><span class="nb">Object</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">person</span><span class="p">.</span><span class="nx">age</span> <span class="o">&gt;</span> <span class="mi">30</span><span class="o">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another common task: get a particular property of each element. Again,
underscore.as takes care of the plumbing.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 03 */</span>
</span><span class='line'><span class="c1">// idiomatic AS3</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">person</span><span class="o">:</span><span class="nb">Object</span> <span class="k">in</span> <span class="nx">list</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">result</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">person</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">list</span><span class="p">).</span><span class="nx">pluck</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>It also makes it easy to get the results of a function for each element&#8230;</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 04 */</span>
</span><span class='line'><span class="c1">// idiomatic AS3</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">person</span><span class="o">:</span><span class="nb">Object</span> <span class="k">in</span> <span class="nx">list</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">result</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">buildIcon</span><span class="p">(</span><span class="nx">person</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">list</span><span class="p">).</span><span class="nx">map</span><span class="p">(</span><span class="nx">buildIcon</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>&#8230;or to just <em>do</em> something to each element:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 05 */</span>
</span><span class='line'><span class="c1">// idiomatic AS3</span>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">person</span><span class="o">:</span><span class="nb">Object</span> <span class="k">in</span> <span class="nx">list</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nf">trace</span><span class="p">(</span><span class="nx">person</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s2">&quot;: &quot;</span> <span class="o">+</span> <span class="nx">person</span><span class="p">.</span><span class="nx">age</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="nx">_</span><span class="p">(</span><span class="nx">list</span><span class="p">).</span><span class="k">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">person</span><span class="o">:*</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>  <span class="nf">trace</span><span class="p">(</span><span class="nx">person</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s2">&quot;: &quot;</span> <span class="o">+</span> <span class="nx">person</span><span class="p">.</span><span class="nx">age</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Okay, maybe that last one wasn&#8217;t so impressive&#8230; but what if we want to combine
these operations? Let&#8217;s filter the elements on a criterion, then build an icon
for each one, setting each icon to 50% alpha.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 06 */</span>
</span><span class='line'><span class="c1">// idiomatic AS3</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="k">for</span> <span class="k">each</span> <span class="p">(</span><span class="k">var</span> <span class="nx">person</span><span class="o">:</span><span class="nb">Object</span> <span class="k">in</span> <span class="nx">list</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">person</span><span class="p">.</span><span class="nx">age</span> <span class="o">&gt;</span> <span class="mi">30</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nx">icon</span><span class="o">:</span><span class="nb">Sprite</span> <span class="o">=</span> <span class="nx">buildIcon</span><span class="p">(</span><span class="nx">person</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">icon</span><span class="p">.</span><span class="nx">alpha</span> <span class="o">=</span> <span class="mf">0.5</span><span class="o">;</span>
</span><span class='line'>    <span class="nx">result</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">icon</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">list</span><span class="p">).</span><span class="nx">chain</span><span class="p">().</span><span class="nx">select</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">person</span><span class="o">:</span><span class="nb">Object</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">person</span><span class="p">.</span><span class="nx">age</span> <span class="o">&gt;</span> <span class="mi">30</span><span class="o">;</span>
</span><span class='line'><span class="p">}).</span><span class="nx">map</span><span class="p">(</span><span class="nx">buildIcon</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">icon</span><span class="o">:</span><span class="nb">Sprite</span><span class="p">)</span><span class="o">:</span><span class="nb">Sprite</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">icon</span><span class="p">.</span><span class="nx">alpha</span> <span class="o">=</span> <span class="mf">0.5</span><span class="o">;</span>
</span><span class='line'><span class="p">}).</span><span class="nx">value</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>You may be thinking, at this point, that these two examples are about the same
length, and the first is more readable, because it looks more like normal AS3
code. You would be right. But let&#8217;s revisit that example, assuming the
existence of these two functions:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 07 */</span>
</span><span class='line'><span class="c1">// function generators</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">greaterThan</span><span class="p">(</span><span class="nx">threshold</span><span class="o">:</span><span class="nb">int</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">age</span><span class="o">:</span><span class="nb">int</span><span class="p">)</span><span class="o">:</span><span class="nb">Boolean</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">age</span> <span class="o">&gt;</span> <span class="nx">threshold</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">setAlphaTo</span><span class="p">(</span><span class="nx">value</span><span class="o">:</span><span class="nb">Number</span><span class="p">)</span><span class="o">:</span><span class="nb">Function</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">target</span><span class="o">:</span><span class="nb">Sprite</span><span class="p">)</span><span class="o">:</span><span class="nb">Sprite</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">target</span><span class="p">.</span><span class="nx">alpha</span> <span class="o">=</span> <span class="nx">value</span><span class="o">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">target</span><span class="o">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>These are functions which create special-purpose functions, functions that
come equipped with information they need to do their work. This process is
called &#8220;partial application,&#8221; and it&#8217;s one major use of the power of closures.
I&#8217;ll explain what it means soon. For now, just look at this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 08 */</span>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="k">var</span> <span class="nx">result</span><span class="o">:</span><span class="nb">Array</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">list</span><span class="p">).</span><span class="nx">chain</span><span class="p">()</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">select</span><span class="p">(</span><span class="nx">greaterThan</span><span class="p">(</span><span class="mi">30</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">buildIcon</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">setAlphaTo</span><span class="p">(</span><span class="mf">0.5</span><span class="p">))</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">value</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Suddenly the code looks less like AS3 and more like a special language designed
to do exactly what you wanted. That&#8217;s the power of functional programming.</p>

<h2>Modifying Functions</h2>

<p>underscore.as also makes it easy to modify functions themselves, and this is
where it really makes hard things easy. For instance, executing a function
after a delay:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 09 */</span>
</span><span class='line'><span class="c1">// idiomatic AS3</span>
</span><span class='line'><span class="k">var</span> <span class="nx">timer</span><span class="o">:</span><span class="nb">Timer</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Timer</span><span class="p">(</span><span class="mi">1000</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="nx">timer</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">TimerEvent</span><span class="p">.</span><span class="nx">TIMER_COMPLETE</span><span class="o">,</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">doStuff</span><span class="p">();</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="nx">timer</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="nx">_</span><span class="p">(</span><span class="nx">doStuff</span><span class="p">).</span><span class="nx">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>When handling user input, sometimes you want to execute an event handler only
after a stream of input events has ceased. Responding to typed input by querying
a database, perhaps, or handling a scrollbar drag by loading more content. This
concept goes back to the earliest days of electrical engineering, where a lever
might literally bounce when flipped, causing a false double signal; thus,
ignoring extra inputs is called &#8220;debouncing.&#8221; In traditional AS3, it&#8217;s fairly
verbose, but underscore.as handles it in a single call:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 10 */</span>
</span><span class='line'><span class="c1">// relatively idiomatic AS3</span>
</span><span class='line'><span class="k">var</span> <span class="nx">scrollDelayTimer</span><span class="o">:</span><span class="nb">Timer</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Timer</span><span class="p">(</span><span class="mi">250</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="nx">scrollDelayTimer</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">TimerEvent</span><span class="p">.</span><span class="nx">TIMER_COMPLETE</span><span class="o">,</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">update</span><span class="p">();</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">handleScroll</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">scrollDelayTimer</span><span class="p">.</span><span class="nx">isRunning</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">scrollDelayTimer</span><span class="p">.</span><span class="nx">reset</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nx">scrollDelayTimer</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">scrollBar</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">Event</span><span class="p">.</span><span class="nx">CHANGE</span><span class="o">,</span> <span class="nx">handleScroll</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">handleScroll</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="nb">Event</span><span class="p">)</span><span class="o">:</span><span class="nx">void</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">update</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">scrollBar</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="nb">Event</span><span class="p">.</span><span class="nx">CHANGE</span><span class="o">,</span> <span class="nx">_</span><span class="p">(</span><span class="nx">handleScroll</span><span class="p">).</span><span class="nx">debounce</span><span class="p">(</span><span class="mi">250</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>You could do the idiomatic version in fewer lines&#8230; by making it less
idiomatic. The more you add closures and anonymous functions, the closer you
get to how underscore.as is implemented under the hood in the first place.</p>

<p>One last example: built-in result caching. If we have a function which takes
time to get a result, but it always gets the same result for the same input
value, it is wise to cache each result so we can get it instantly on subsequent
calls.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='actionscript'><span class='line'><span class="cm">/* figure 11 */</span>
</span><span class='line'><span class="c1">// idiomatic AS3</span>
</span><span class='line'><span class="c1">// original...</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">verySlowLookup</span><span class="p">(</span><span class="nx">id</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nx">ComplexObject</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">getFromLegacyDatabase</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// and with caching:</span>
</span><span class='line'><span class="k">var</span> <span class="nx">lookupResults</span><span class="o">:</span><span class="nb">Dictionary</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Dictionary</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">verySlowLookup</span><span class="p">(</span><span class="nx">id</span><span class="o">:</span><span class="nb">String</span><span class="p">)</span><span class="o">:</span><span class="nx">ComplexObject</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">lookupResults</span><span class="p">[</span><span class="nx">id</span><span class="p">]</span> <span class="o">||</span> <span class="nx">getFromLegacyDatabase</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// underscore.as</span>
</span><span class='line'><span class="k">var</span> <span class="nx">verySlowLookup</span><span class="o">:</span><span class="nb">Function</span> <span class="o">=</span> <span class="nx">_</span><span class="p">(</span><span class="nx">getFromLegacyDatabase</span><span class="p">).</span><span class="nx">memoize</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ready to start playing with it yourself?
<a href="http://github.com/amacdougall/underscore.as">Grab it from github</a>,
and read the inline documentation in com.alanmacdougall.underscore._
for instructions; the
<a href="http://documentcloud.github.com/underscore/">documentation for underscore.js</a>
will help too.</p>

<p>Interested, but want to know more? Stay tuned: in coming posts, I&#8217;ll explain
anonymous functions, closures, and how they apply to both standard AS3 and
underscore.as.</p>
]]></content>
  </entry>
  
</feed>
