arrays, count characters, that sort of thing.</p></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-2"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-2">#</a></div><p>Set up exported variables for both <strong>Node.js</strong> and the browser.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">this</span><spanclass="p">.</span><spanclass="nv">exports: </span><spanclass="k">this</span><spanclass="nx">unless</span><spanclass="nx">process</span><spanclass="o">?</span>
<spanclass="nv">helpers: exports.helpers: </span><spanclass="p">{}</span></pre></div></td></tr><trid="section-3"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-3">#</a></div><p>Cross-browser indexOf, so that IE can join the party.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.index_of: index_of: </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">,</span><spanclass="nx">item</span><spanclass="p">,</span><spanclass="nx">from</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="o">-</span><spanclass="mi">1</span></pre></div></td></tr><trid="section-4"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-4">#</a></div><p>Does a list include a value?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.include: include: </span><spanclass="p">(</span><spanclass="nx">list</span><spanclass="p">,</span><spanclass="nx">value</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">index_of</span><spanclass="p">(</span><spanclass="nx">list</span><spanclass="p">,</span><spanclass="nx">value</span><spanclass="p">)</span><spanclass="o">>=</span><spanclass="mi">0</span></pre></div></td></tr><trid="section-5"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-5">#</a></div><p>Peek at the beginning of a given string to see if it matches a sequence.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.starts: starts: </span><spanclass="p">(</span><spanclass="nx">string</span><spanclass="p">,</span><spanclass="nx">literal</span><spanclass="p">,</span><spanclass="nx">start</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">string</span><spanclass="p">.</span><spanclass="nx">substring</span><spanclass="p">(</span><spanclass="nx">start</span><spanclass="p">,</span><spanclass="p">(</span><spanclass="nx">start</span><spanclass="o">or</span><spanclass="mi">0</span><spanclass="p">)</span><spanclass="o">+</span><spanclass="nx">literal</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="p">)</span><spanclass="o">is</span><spanclass="nx">literal</span></pre></div></td></tr><trid="section-6"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-6">#</a></div><p>Trim out all falsy values from an array.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.compact: compact: </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">)</span><spanclass="o">-></span><spanclass="nx">item</span><spanclass="k">for</span><spanclass="nx">item</span><spanclass="k">in</span><spanclass="nx">array</span><spanclass="k">when</span><spanclass="nx">item</span></pre></div></td></tr><trid="section-7"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-7">#</a></div><p>Count the number of occurences of a character in a string.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.count: count: </span><spanclass="p">(</span><spanclass="nx">string</span><spanclass="p">,</span><spanclass="nx">letter</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">num</span></pre></div></td></tr><trid="section-8"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-8">#</a></div><p>Merge objects, returning a fresh copy with attributes from both sides.
options hash to propagate down the tree without polluting other branches.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.merge: merge: </span><spanclass="p">(</span><spanclass="nx">options</span><spanclass="p">,</span><spanclass="nx">overrides</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">fresh</span></pre></div></td></tr><trid="section-9"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-9">#</a></div><p>Extend a source object with the properties of another object (shallow copy).
We use this to simulate Node's deprecated <code>process.mixin</code></p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.extend: extend: </span><spanclass="p">(</span><spanclass="nx">object</span><spanclass="p">,</span><spanclass="nx">properties</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="p">(</span><spanclass="nx">object</span><spanclass="p">[</span><spanclass="nx">key</span><spanclass="p">]</span><spanclass="o">:</span><spanclass="nx">val</span><spanclass="p">)</span><spanclass="k">for</span><spanclass="nx">key</span><spanclass="p">,</span><spanclass="nx">val</span><spanclass="k">of</span><spanclass="nx">properties</span></pre></div></td></tr><trid="section-10"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-10">#</a></div><p>Return a completely flattened version of an array. Handy for getting a
list of <code>children</code> from the nodes.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.flatten: flatten: </span><spanclass="p">(</span><spanclass="nx">array</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">memo</span></pre></div></td></tr><trid="section-11"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-11">#</a></div><p>Delete a key from an object, returning the value. Useful when a node is
looking for a particular method in an options hash.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.del: del: </span><spanclass="p">(</span><spanclass="nx">obj</span><spanclass="p">,</span><spanclass="nx">key</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">val</span></pre></div></td></tr><trid="section-12"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-12">#</a></div><p>Matches a balanced group such as a single or double-quoted string. Pass in
interpolations within strings, ad infinitum.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">helpers.balanced_string: balanced_string: </span><spanclass="p">(</span><spanclass="nx">str</span><spanclass="p">,</span><spanclass="nx">delimited</span><spanclass="p">,</span><spanclass="nx">options</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="k">throw</span><spanclass="k">new</span><spanclass="nb">Error</span><spanclass="s2">"SyntaxError: Unterminated ${levels.pop()[0]} starting on line ${@line + 1}"</span>