Elixir Recipes A collection of Elixir programming language solutions to common problems. http://elixir-recipes.github.io/ Wed, 14 Feb 2018 09:53:19 +0800 Wed, 14 Feb 2018 09:53:19 +0800 Jekyll v3.6.0 Iterating over all keys of the map while keeping key order <p>Map in Elixir does not guarantee the key sorting order.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="c1"># With integer as a key, the key is ordered for the first 32 keys.</span> <span class="n">iex</span><span class="p">(</span><span class="m">1</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">map</span> <span class="o">=</span> <span class="p">%{</span> <span class="m">1</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">6</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">7</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">21</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">22</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">23</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">24</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">25</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">26</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">27</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">11</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">12</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">13</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">14</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">15</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">16</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">17</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">61</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">62</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">63</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">64</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">65</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">66</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">67</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">51</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">52</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">53</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">54</span> <span class="o">=&gt;</span> <span class="m">4</span> <span class="p">}</span> <span class="c1"># However, if the number of key is greater than 32, they will not be ordered.</span> <span class="n">iex</span><span class="p">(</span><span class="m">2</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">map2</span> <span class="o">=</span> <span class="p">%{</span> <span class="m">1</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">6</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">7</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">21</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">22</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">23</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">24</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">25</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">26</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">27</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">11</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">12</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">13</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">14</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">15</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">16</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">17</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">61</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">62</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">63</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">64</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">65</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">66</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">67</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">51</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">52</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">53</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">54</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">55</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">56</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">57</span> <span class="o">=&gt;</span> <span class="m">7</span><span class="p">,</span> <span class="m">41</span> <span class="o">=&gt;</span> <span class="m">1</span><span class="p">,</span> <span class="m">42</span> <span class="o">=&gt;</span> <span class="m">2</span><span class="p">,</span> <span class="m">43</span> <span class="o">=&gt;</span> <span class="m">3</span><span class="p">,</span> <span class="m">44</span> <span class="o">=&gt;</span> <span class="m">4</span><span class="p">,</span> <span class="m">45</span> <span class="o">=&gt;</span> <span class="m">5</span><span class="p">,</span> <span class="m">46</span> <span class="o">=&gt;</span> <span class="m">6</span><span class="p">,</span> <span class="m">47</span> <span class="o">=&gt;</span> <span class="m">7</span> <span class="p">}</span></code></pre></figure> <p>Sometime you may want to iterate through the map while keeping the key in order, this could be done by converting it to the list.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">iex</span><span class="p">(</span><span class="m">3</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">sorted_map</span> <span class="o">=</span> <span class="no">Enum</span><span class="o">.</span><span class="n">to_list</span><span class="p">(</span><span class="n">map2</span><span class="p">)</span> <span class="o">|&gt;</span> <span class="no">Enum</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="k">fn</span><span class="p">({</span><span class="n">key1</span><span class="p">,</span> <span class="n">value1</span><span class="p">},</span> <span class="p">{</span><span class="n">key2</span><span class="p">,</span> <span class="n">value2</span><span class="p">})</span> <span class="o">-&gt;</span> <span class="n">key1</span> <span class="o">&lt;</span> <span class="n">key2</span> <span class="k">end</span><span class="p">)</span> <span class="c1"># [{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {6, 6}, {7, 7}, {11, 1}, {12, 2},</span> <span class="p">{</span><span class="m">13</span><span class="p">,</span> <span class="m">3</span><span class="p">},</span> <span class="p">{</span><span class="m">14</span><span class="p">,</span> <span class="m">4</span><span class="p">},</span> <span class="p">{</span><span class="m">15</span><span class="p">,</span> <span class="m">5</span><span class="p">},</span> <span class="p">{</span><span class="m">16</span><span class="p">,</span> <span class="m">6</span><span class="p">},</span> <span class="p">{</span><span class="m">17</span><span class="p">,</span> <span class="m">7</span><span class="p">},</span> <span class="p">{</span><span class="m">21</span><span class="p">,</span> <span class="m">1</span><span class="p">},</span> <span class="p">{</span><span class="m">22</span><span class="p">,</span> <span class="m">2</span><span class="p">},</span> <span class="p">{</span><span class="m">23</span><span class="p">,</span> <span class="m">3</span><span class="p">},</span> <span class="p">{</span><span class="m">24</span><span class="p">,</span> <span class="m">4</span><span class="p">},</span> <span class="p">{</span><span class="m">25</span><span class="p">,</span> <span class="m">5</span><span class="p">},</span> <span class="p">{</span><span class="m">26</span><span class="p">,</span> <span class="m">6</span><span class="p">},</span> <span class="p">{</span><span class="m">27</span><span class="p">,</span> <span class="m">7</span><span class="p">},</span> <span class="p">{</span><span class="m">41</span><span class="p">,</span> <span class="m">1</span><span class="p">},</span> <span class="p">{</span><span class="m">42</span><span class="p">,</span> <span class="m">2</span><span class="p">},</span> <span class="p">{</span><span class="m">43</span><span class="p">,</span> <span class="m">3</span><span class="p">},</span> <span class="p">{</span><span class="m">44</span><span class="p">,</span> <span class="m">4</span><span class="p">},</span> <span class="p">{</span><span class="m">45</span><span class="p">,</span> <span class="m">5</span><span class="p">},</span> <span class="p">{</span><span class="m">46</span><span class="p">,</span> <span class="m">6</span><span class="p">},</span> <span class="p">{</span><span class="m">47</span><span class="p">,</span> <span class="m">7</span><span class="p">},</span> <span class="p">{</span><span class="m">51</span><span class="p">,</span> <span class="m">1</span><span class="p">},</span> <span class="p">{</span><span class="m">52</span><span class="p">,</span> <span class="m">2</span><span class="p">},</span> <span class="p">{</span><span class="m">53</span><span class="p">,</span> <span class="m">3</span><span class="p">},</span> <span class="p">{</span><span class="m">54</span><span class="p">,</span> <span class="m">4</span><span class="p">},</span> <span class="p">{</span><span class="m">55</span><span class="p">,</span> <span class="m">5</span><span class="p">},</span> <span class="p">{</span><span class="m">56</span><span class="p">,</span> <span class="m">6</span><span class="p">},</span> <span class="p">{</span><span class="m">57</span><span class="p">,</span> <span class="m">7</span><span class="p">},</span> <span class="p">{</span><span class="m">61</span><span class="p">,</span> <span class="m">1</span><span class="p">},</span> <span class="p">{</span><span class="m">62</span><span class="p">,</span> <span class="m">2</span><span class="p">},</span> <span class="p">{</span><span class="m">63</span><span class="p">,</span> <span class="m">3</span><span class="p">},</span> <span class="p">{</span><span class="m">64</span><span class="p">,</span> <span class="m">4</span><span class="p">},</span> <span class="p">{</span><span class="m">65</span><span class="p">,</span> <span class="m">5</span><span class="p">},</span> <span class="p">{</span><span class="m">66</span><span class="p">,</span> <span class="m">6</span><span class="p">},</span> <span class="p">{</span><span class="m">67</span><span class="p">,</span> <span class="m">7</span><span class="p">}]</span></code></pre></figure> Tue, 13 Feb 2018 00:00:00 +0800 http://elixir-recipes.github.io/collections/iterating-over-all-keys-of-the-map-while-keeping-key-order/ http://elixir-recipes.github.io/collections/iterating-over-all-keys-of-the-map-while-keeping-key-order/ collections How to connect and debug Elixir or Phoenix App at Heroku? <p>Heroku has a great feature called <code class="highlighter-rouge">heroku ps:exec</code> which allows you to connect to running nodes. You can use this command to connect your elixir nodes easily. And debug your nodes like in your network.</p> <h3 id="step-1">Step 1</h3> <p>Let’s start with <code class="highlighter-rouge">Procfile</code> To run a named app at heroku your procfile should specify the app name like:</p> <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>web: MIX_ENV=prod elixir --sname coolelixirapp -S mix run --no-halt </code></pre></div></div> <p>If you are using Phoenix framework:</p> <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>web: MIX_ENV=prod elixir --sname coolelixirapp -S mix phx.server </code></pre></div></div> <h3 id="step-2">Step 2</h3> <p>Deploy your app with one of these Procfiles depending on your app type.</p> <h3 id="step-3">Step 3</h3> <p>On your local:</p> <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>heroku config <span class="c"># list your heroku app configs</span> <span class="nv">$ </span>heroku ps:exec <span class="c"># --dyno=web.1 # will connect you to web.1 dyno</span> </code></pre></div></div> <p>Note: <code class="highlighter-rouge">heroku ps:exec</code> command does not export your configs to the heroku <code class="highlighter-rouge">bash</code> shell. So you will need to export them by yourself.</p> <h3 id="step-4">Step 4</h3> <p>Now you are in Heroku <code class="highlighter-rouge">bash</code> shell for <code class="highlighter-rouge">web.1</code> dyno:</p> <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="c"># You may need to export env vars which listed in previous 'heroku config' execution.</span> <span class="nv">$ </span><span class="nb">export </span><span class="nv">DATABASE_URL</span><span class="o">=</span>postgres://username:password@hostname:5432/dbname<span class="p">;</span> <span class="nv">$ </span><span class="nb">export </span><span class="nv">DATABASE_POOL_SIZE</span><span class="o">=</span>1<span class="p">;</span> <span class="nv">$ </span><span class="c"># .... Do your all necessary exports</span> <span class="nv">$ MIX_ENV</span><span class="o">=</span>prod iex <span class="nt">--sname</span> coolelixirconsole <span class="nt">-S</span> mix <span class="c"># Run a console app</span> </code></pre></div></div> <h3 id="step-5">Step 5</h3> <p>Now you are in Elixir console with app name <code class="highlighter-rouge">coolelixirconsole</code>:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="o">&gt;&gt;</span> <span class="n">iex</span><span class="p">(</span><span class="n">coolelixirconsole</span><span class="nv">@hostname</span><span class="p">)</span><span class="m">1</span><span class="o">&gt;</span> <span class="no">Node</span><span class="o">.</span><span class="n">ping</span> <span class="ss">:"coolelixirapp@hostname"</span> <span class="o">&gt;&gt;&gt;</span> <span class="ss">:pong</span> <span class="c1"># We are connected to our running Elixir node from heroku ps:exec console</span> <span class="o">&gt;&gt;</span> <span class="n">iex</span><span class="p">(</span><span class="n">coolelixirconsole</span><span class="nv">@hostname</span><span class="p">)</span><span class="m">2</span><span class="o">&gt;</span> <span class="no">Node</span><span class="o">.</span><span class="n">list</span> <span class="o">&gt;&gt;&gt;</span> <span class="p">[</span><span class="ss">:"coolelixirapp@hostname"</span><span class="p">]</span> <span class="c1"># As expected it is in the list</span> <span class="o">&gt;&gt;</span> <span class="n">iex</span><span class="p">(</span><span class="n">coolelixirconsole</span><span class="nv">@hostname</span><span class="p">)</span><span class="m">3</span><span class="o">&gt;</span> <span class="c1"># Now you can tell what to do to your app as in your network.</span></code></pre></figure> <h3 id="references">References</h3> <ul> <li>https://devcenter.heroku.com/articles/exec</li> <li>https://hexdocs.pm/phoenix/heroku.html</li> <li>http://elixir-recipes.github.io/concurrency/connecting-nodes-different-machines/</li> <li>https://gist.github.com/mustafaturan/de39ecab9f344c91f495f0f51748f7a1 (Original)</li> </ul> Sat, 21 Oct 2017 00:00:00 +0800 http://elixir-recipes.github.io/debug/how-to-connect-and-debug-elixir-or-phoenix-app-at-heroku/ http://elixir-recipes.github.io/debug/how-to-connect-and-debug-elixir-or-phoenix-app-at-heroku/ debug Create an array containing the alphabet <p>A char list containing the alphabet can be obtained by doing the following:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">iex</span><span class="o">&gt;</span> <span class="n">for</span> <span class="n">n</span> <span class="o">&lt;-</span> <span class="sx">?a</span><span class="o">..</span><span class="sx">?z</span><span class="p">,</span> <span class="k">do</span><span class="p">:</span> <span class="n">n</span> <span class="s1">'abcdefghijklmnopqrstuvwxyz'</span></code></pre></figure> <p>If desired, we can pass each bitcode to a binary to represent each letter as a string:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">iex</span><span class="o">&gt;</span> <span class="n">for</span> <span class="n">n</span> <span class="o">&lt;-</span> <span class="sx">?a</span><span class="o">..</span><span class="sx">?z</span><span class="p">,</span> <span class="k">do</span><span class="p">:</span> <span class="o">&lt;&lt;</span> <span class="n">n</span> <span class="p">::</span> <span class="n">utf8</span> <span class="o">&gt;&gt;</span> <span class="p">[</span><span class="sd">"</span><span class="s2">a"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">b"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">c"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">d"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">e"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">f"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">g"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">h"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">i"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">j"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">k"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">l"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">m"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">n"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">o"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">p"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">q"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">r"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">s"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">t"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">u"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">v"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">w"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">x"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">y"</span><span class="p">,</span> <span class="sd">"</span><span class="s2">z"</span><span class="p">]</span></code></pre></figure> <p><strong>Additional reading:</strong></p> <ul> <li><a href="http://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html">Binaries, strings, and char lists</a></li> </ul> Sun, 20 Nov 2016 00:00:00 +0800 http://elixir-recipes.github.io/strings/list-with-alphabet/ http://elixir-recipes.github.io/strings/list-with-alphabet/ strings Cancel a multiline command <p>When typing multiline commands into IEx it is easy to get lost in opening and closing symbols. For those cases you can issue <code class="highlighter-rouge">#iex:break</code> to interrupt the declaration of that command. For example:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">iex</span><span class="o">&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="sd">"</span><span class="s2">hello world ...&gt; ...&gt; </span><span class="err">#</span><span class="s2">iex:break ** (TokenMissingError) iex:1: incomplete expression iex&gt;</span></code></pre></figure> <p><strong>Additional reading:</strong></p> <ul> <li><a href="http://elixir-lang.org/docs/stable/iex/IEx.html">Elixir interactive shell</a></li> </ul> Sun, 20 Nov 2016 00:00:00 +0800 http://elixir-recipes.github.io/iex/cancel-multiline-command/ http://elixir-recipes.github.io/iex/cancel-multiline-command/ IEx Finding matching elements in a list or a map <p>When storing data in lists or maps in Elixir we can use pattern matching to access the elements of those collections easily.</p> <p>Below are a few ways of how to do it.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="k">defmodule</span> <span class="no">Find</span> <span class="k">do</span> <span class="nv">@moduledoc</span> <span class="sd">""" Implements methods to find elements in given collections by pattern matching. """</span> <span class="nv">@doc</span> <span class="sd">""" Finds the first element in a list to match a given pattern. """</span> <span class="k">def</span> <span class="n">first_match</span><span class="p">(</span><span class="n">collection</span><span class="p">)</span> <span class="k">do</span> <span class="no">Enum</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">collection</span><span class="p">,</span> <span class="k">fn</span><span class="p">(</span><span class="n">element</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">match?</span><span class="p">({</span><span class="ss">:fruit</span><span class="p">,</span> <span class="n">_</span><span class="p">},</span> <span class="n">element</span><span class="p">)</span> <span class="k">end</span><span class="p">)</span> <span class="k">end</span> <span class="nv">@doc</span> <span class="sd">""" Finds all the elements in a list that match a given pattern. """</span> <span class="k">def</span> <span class="n">all_matches</span><span class="p">(</span><span class="n">collection</span><span class="p">)</span> <span class="k">do</span> <span class="no">Enum</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">collection</span><span class="p">,</span> <span class="k">fn</span><span class="p">(</span><span class="n">element</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">match?</span><span class="p">({</span><span class="ss">:fruit</span><span class="p">,</span> <span class="n">_</span><span class="p">},</span> <span class="n">element</span><span class="p">)</span> <span class="k">end</span><span class="p">)</span> <span class="k">end</span> <span class="k">end</span></code></pre></figure> <p>And then, to test the implemented methods:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">iex</span><span class="o">&gt;</span> <span class="kn">require</span> <span class="no">Find</span> <span class="n">iex</span><span class="o">&gt;</span> <span class="n">array</span> <span class="o">=</span> <span class="p">[{</span><span class="ss">:fruit</span><span class="p">,</span> <span class="sd">"</span><span class="s2">Apple"</span><span class="p">},</span> <span class="p">{</span><span class="ss">:vegetable</span><span class="p">,</span> <span class="sd">"</span><span class="s2">Carrot"</span><span class="p">},</span> <span class="p">{</span><span class="ss">:fruit</span><span class="p">,</span> <span class="sd">"</span><span class="s2">Orange"</span><span class="p">}]</span> <span class="n">iex</span><span class="o">&gt;</span> <span class="no">Find</span><span class="o">.</span><span class="n">first_match</span><span class="p">(</span><span class="n">array</span><span class="p">)</span> <span class="p">{</span><span class="ss">:fruit</span><span class="p">,</span> <span class="sd">"</span><span class="s2">Apple"</span><span class="p">}</span> <span class="n">iex</span><span class="o">&gt;</span> <span class="no">Find</span><span class="o">.</span><span class="n">all_matches</span><span class="p">(</span><span class="n">array</span><span class="p">)</span> <span class="p">[{</span><span class="ss">:fruit</span><span class="p">,</span> <span class="sd">"</span><span class="s2">Apple"</span><span class="p">},</span> <span class="p">{</span><span class="ss">:fruit</span><span class="p">,</span> <span class="sd">"</span><span class="s2">Orange"</span><span class="p">}]</span> <span class="n">iex</span><span class="o">&gt;</span> <span class="n">map</span> <span class="o">=</span> <span class="p">%{</span><span class="ss">fruit:</span> <span class="sd">"</span><span class="s2">Apple"</span><span class="p">,</span> <span class="ss">vegetable:</span> <span class="sd">"</span><span class="s2">Carrot"</span><span class="p">}</span> <span class="n">iex</span><span class="o">&gt;</span> <span class="no">Find</span><span class="o">.</span><span class="n">first_match</span><span class="p">(</span><span class="n">map</span><span class="p">)</span> <span class="p">{</span><span class="ss">:fruit</span><span class="p">,</span> <span class="sd">"</span><span class="s2">Apple"</span><span class="p">}</span> <span class="n">iex</span><span class="o">&gt;</span> <span class="no">Find</span><span class="o">.</span><span class="n">all_matches</span><span class="p">(</span><span class="n">map</span><span class="p">)</span> <span class="p">[{</span><span class="ss">:fruit</span><span class="p">,</span> <span class="sd">"</span><span class="s2">Apple"</span><span class="p">}]</span></code></pre></figure> <p><strong>Additional reading:</strong></p> <ul> <li><a href="http://elixir-lang.org/docs/stable/elixir/Enum.html">Enum</a></li> <li><a href="http://elixir-lang.org/getting-started/pattern-matching.html">Pattern Matching</a></li> </ul> Thu, 17 Nov 2016 00:00:00 +0800 http://elixir-recipes.github.io/collections/find-matching-element-in-collection/ http://elixir-recipes.github.io/collections/find-matching-element-in-collection/ collections Counting words in a file <p>Use the <code class="highlighter-rouge">File</code> module to read a file.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">file</span> <span class="o">=</span> <span class="sd">"</span><span class="s2">foo.txt"</span> <span class="k">case</span> <span class="no">File</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">file</span><span class="p">)</span> <span class="k">do</span> <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">body</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="n">body</span> <span class="o">|&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="n">reason</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="sd">"</span><span class="s2">Could not read file </span><span class="si">#{</span><span class="n">file</span><span class="si">}</span><span class="s2"> because </span><span class="si">#{</span><span class="n">reason</span><span class="si">}</span><span class="s2">"</span> <span class="o">|&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="k">end</span></code></pre></figure> <p>One application of this could be to count the number of words in a file.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">file</span> <span class="o">=</span> <span class="sd">"</span><span class="s2">foo.txt"</span> <span class="k">case</span> <span class="no">File</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">file</span><span class="p">)</span> <span class="k">do</span> <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">body</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="no">String</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="o">|&gt;</span> <span class="n">length</span> <span class="o">|&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="n">reason</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="sd">"</span><span class="s2">Could not read file </span><span class="si">#{</span><span class="n">file</span><span class="si">}</span><span class="s2"> because </span><span class="si">#{</span><span class="n">reason</span><span class="si">}</span><span class="s2">"</span> <span class="o">|&gt;</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="k">end</span></code></pre></figure> Fri, 28 Oct 2016 00:00:00 +0800 http://elixir-recipes.github.io/files/counting-words-in-a-file/ http://elixir-recipes.github.io/files/counting-words-in-a-file/ files Checking if a string includes a substring <p>Use the <code class="highlighter-rouge">=~</code> operator to check if a string on the left-hand-side includes a substring on the right-hand-side:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">iex</span><span class="o">&gt;</span> <span class="sd">"</span><span class="s2">1test2"</span> <span class="o">==</span> <span class="sd">"</span><span class="s2">test"</span> <span class="no">false</span> <span class="n">iex</span><span class="o">&gt;</span> <span class="sd">"</span><span class="s2">1test2"</span> <span class="o">=~</span> <span class="sd">"</span><span class="s2">test"</span> <span class="no">true</span></code></pre></figure> <p>One application of <code class="highlighter-rouge">=~</code> in Phoenix is in controller tests:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="k">defmodule</span> <span class="no">RealtimeUsers</span><span class="o">.</span><span class="no">PageControllerTest</span> <span class="k">do</span> <span class="kn">use</span> <span class="no">RealtimeUsers</span><span class="o">.</span><span class="no">ConnCase</span> <span class="n">test</span> <span class="sd">"</span><span class="s2">GET /"</span><span class="p">,</span> <span class="p">%{</span><span class="ss">conn:</span> <span class="n">conn</span><span class="p">}</span> <span class="k">do</span> <span class="n">conn</span> <span class="o">=</span> <span class="n">get</span> <span class="n">conn</span><span class="p">,</span> <span class="sd">"</span><span class="s2">/"</span> <span class="n">assert</span> <span class="n">html_response</span><span class="p">(</span><span class="n">conn</span><span class="p">,</span> <span class="m">200</span><span class="p">)</span> <span class="o">=~</span> <span class="sd">"</span><span class="s2">Welcome to Phoenix!"</span> <span class="k">end</span> <span class="k">end</span></code></pre></figure> Wed, 19 Oct 2016 00:00:00 +0800 http://elixir-recipes.github.io/strings/checking-if-strings-contain-substring/ http://elixir-recipes.github.io/strings/checking-if-strings-contain-substring/ strings List all Phoenix routes <p>Use the <code class="highlighter-rouge">mix phoenix.routes</code> to list out all your routes:</p> <figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="o">&gt;</span> mix phoenix.routes page_path GET / RealtimeUsers.PageController :index hello_path GET /hello RealtimeUsers.HelloController :index hello_path GET /hello/:messenger RealtimeUsers.HelloController :show</code></pre></figure> Thu, 29 Sep 2016 00:00:00 +0800 http://elixir-recipes.github.io/phoenix/list-phoenix-routes/ http://elixir-recipes.github.io/phoenix/list-phoenix-routes/ phoenix Monitoring a process <p>Monitoring a process notifies the monitor process if the monitored process crashes. Unlike <code class="highlighter-rouge">spawn_link</code>, it doesn’t crash the monitoring process:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="c1"># Span a new process</span> <span class="n">pid</span> <span class="o">=</span> <span class="n">spawn</span><span class="p">(</span><span class="k">fn</span> <span class="o">-&gt;</span> <span class="ss">:timer</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="m">100</span><span class="p">)</span> <span class="k">end</span><span class="p">)</span> <span class="c1"># Monitor the process</span> <span class="no">Process</span><span class="o">.</span><span class="n">monitor</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span> <span class="c1"># Kill the process</span> <span class="no">Process</span><span class="o">.</span><span class="k">exit</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="ss">:kill</span><span class="p">)</span> <span class="c1"># Flush the messages of the inbox</span> <span class="n">flush</span> <span class="p">{</span><span class="ss">:DOWN</span><span class="p">,</span> <span class="c1">#Reference&lt;0.0.1.82&gt;, :process, #PID&lt;0.89.0&gt;, :killed}</span></code></pre></figure> Sun, 11 Sep 2016 00:00:00 +0800 http://elixir-recipes.github.io/concurrency/monitoring-a-process/ http://elixir-recipes.github.io/concurrency/monitoring-a-process/ concurrency Convert atoms to strings <p>Use <code class="highlighter-rouge">Atom.to_string</code>:</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">iex</span><span class="o">&gt;</span> <span class="no">Atom</span><span class="o">.</span><span class="n">to_string</span><span class="p">(</span><span class="ss">:foo</span><span class="p">)</span> <span class="sd">"</span><span class="s2">foo"</span></code></pre></figure> Fri, 02 Sep 2016 00:00:00 +0800 http://elixir-recipes.github.io/atoms/convert-atoms-to-strings/ http://elixir-recipes.github.io/atoms/convert-atoms-to-strings/ atoms