<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Fn&#x2F;Log</title>
      <link>https://fnlog.dev</link>
      <description>Diary of an obsessive developer</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://fnlog.dev/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Tue, 26 Mar 2024 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Justifying Rust in the One Billion Rows Challenge</title>
          <pubDate>Tue, 26 Mar 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/justifying-rust-in-one-billion-rows-challenge/</link>
          <guid>https://fnlog.dev/dev/justifying-rust-in-one-billion-rows-challenge/</guid>
          <description>&lt;h2 id=&quot;justifying-rust&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#justifying-rust&quot; aria-label=&quot;Anchor link for: justifying-rust&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Justifying Rust&lt;&#x2F;h2&gt;
&lt;p&gt;Before I start my story, this is not a language battle on which is
&amp;quot;better&amp;quot; but to see in action how a &lt;a href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&#x2F;&quot;&gt;Rust&lt;&#x2F;a&gt; equivalent compares with a &lt;a href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;&quot;&gt;Go&lt;&#x2F;a&gt;
implementation in terms of performance given its promises of performance
without a garbage collector and precise memory management. After this
challenge, I can see how good &lt;em&gt;Go&lt;&#x2F;em&gt;&#x27;s automatic memory manager even if my
implementation was able to outperform it. Preamble aside, I hope this
journey can be informative as well as add some perspective to what
&lt;em&gt;Rust&lt;&#x2F;em&gt; might need.&lt;&#x2F;p&gt;
&lt;p&gt;It started when a &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;corlinp&#x2F;176a97c58099bca36bcd5679e68f9708?permalink_comment_id=4964265#gistcomment-4964265&quot;&gt;person was asking for help&lt;&#x2F;a&gt; with porting some &lt;em&gt;Go&lt;&#x2F;em&gt; gist
to &lt;em&gt;Rust&lt;&#x2F;em&gt; and getting a significantly worse performance profile given
how similar the translation was. The gist was for the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gunnarmorling&#x2F;1brc&quot;&gt;One Billion Row
Challenge&lt;&#x2F;a&gt; by &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;corlinp&#x2F;176a97c58099bca36bcd5679e68f9708&quot;&gt;Corlin Palmer&lt;&#x2F;a&gt; which is a straightforward solution with some
clever optimizations. This piqued my interest and decided to take a stab
at the challenge. Since the challenge deadline is over and mainly for
&lt;em&gt;Java&lt;&#x2F;em&gt;, my goal is to only beat this &lt;em&gt;Go&lt;&#x2F;em&gt; implementation on even terms
and not necessarily optimizing beyond it such as using &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Mmap&quot;&gt;mmap&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Io_uring&quot;&gt;io_uring&lt;&#x2F;a&gt; or
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;simd&#x2F;struct.Simd.html&quot;&gt;SIMD&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gunnarmorling&#x2F;1brc?tab=readme-ov-file#1%EF%B8%8F%E2%83%A3%EF%B8%8F-the-one-billion-row-challenge&quot;&gt;challenge&lt;&#x2F;a&gt; is simply parsing a generated text file with two data
columns (weather station city and temperature measurement) and one
billion rows, calculating aggregates (min, mean and max temperature per
city) and printing the output in a JSON-like format. Generating this
file is around 15 GB and can be done with the non-authoritative &lt;em&gt;Python&lt;&#x2F;em&gt;
script from the main repository:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; clone https:&#x2F;&#x2F;github.com&#x2F;gunnarmorling&#x2F;1brc cd 1brc
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cd src&#x2F;main&#x2F;python
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;python&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; create_measurements.py 1_000_000_000
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;mv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ..&#x2F;..&#x2F;..&#x2F;data&#x2F;measurements.txt &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;HOME&#x2F;measurements.txt
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To set the target, running the &lt;em&gt;Go&lt;&#x2F;em&gt; code on this massive file:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;wget &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;gist.githubusercontent.com&#x2F;corlinp&#x2F;176a97c58099bca36bcd5679e68f9708&#x2F;raw&#x2F;5028f54e727f0f1716a2195de922460949a759fd&#x2F;1brc_corlinp.go&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; go run 1brc_corlinp.go &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;HOME&#x2F;measurements.txt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# real          0m24.533s
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;On my AMD Ryzen 7 machine with 32 GB RAM and 16 logical cores, it takes
an amazingly fast &lt;strong&gt;&lt;strong&gt;24.5 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; that is my time to beat. (It does
break the rules a bit by fitting to a single dataset or assuming a
smaller city length, but who cares and this is for fun.) Since I rarely
tweak for performance, this is not my expertise as I enjoy &lt;em&gt;Rust&lt;&#x2F;em&gt; for
its safety and ergonomics above all. This is to say my techniques are
simple and other more efficient implementations might appeal for more
technical readers, but I also assume the reader is comfortable enough
with the borrow checker. For this article, I will journey through with
the most basic solution, trying different leads and ending with the
winning solution.&lt;&#x2F;p&gt;
&lt;div class=&quot;ox-hugo-toc toc&quot;&gt;
&lt;div class=&quot;heading&quot;&gt;Table of Contents&lt;&#x2F;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#baseline-solution--5m26s&quot;&gt;Baseline Solution (5m26s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#async-rust--5m51s&quot;&gt;Async Rust (5m51s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#byte-chunks--4m49s&quot;&gt;Byte Chunks (4m49s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#fixed-workers--5m12s&quot;&gt;Fixed Workers (5m12s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#object-pool--2m53s&quot;&gt;Object Pool (2m53s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#string-interning--0m52s&quot;&gt;String Interning (0m52s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#no-rayon--0m38s&quot;&gt;No Rayon (0m38s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#integer-arithmetic--0m36s&quot;&gt;Integer Arithmetic (0m36s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#parser-iterator--0m33s&quot;&gt;Parser Iterator (0m33s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#unsafe-str--0m29s&quot;&gt;Unsafe str (0m29s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#allocation-cleanup--0m27-dot-75s&quot;&gt;Allocation Cleanup (0m27.75s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#block-remove--0m26-dot-5s&quot;&gt;Block Remove (0m26.5s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#no-strings--0m24s&quot;&gt;No Strings (0m24s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#tokio-tuning--0m23-dot-5s&quot;&gt;Tokio Tuning (0m23.5s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#special-mention-mo8it-obrc--0m10s&quot;&gt;Special Mention: mo8it&#x2F;obrc (0m10s)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;justifying-rust-in-one-billion-rows-challenge&#x2F;#resources-and-references&quot;&gt;Resources &amp;amp; References&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;div&gt;
&lt;!--endtoc--&gt;
&lt;h2 id=&quot;baseline-solution--5m26s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#baseline-solution--5m26s&quot; aria-label=&quot;Anchor link for: baseline-solution--5m26s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Baseline Solution (5m26s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;8dfbed491a89093839de19198bda0da60a9e4fa5&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;8dfbed491a89093839de19198bda0da60a9e4fa5&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A basic solution to this challenge is to read the file incrementally per
line to avoid loading the whole file to memory, parsing each line and
then storing the results to a hash map of cities and its aggregate
calculation. Starting with a rough implementation:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;KB&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1024&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; The Go code uses 256 KB buffer size.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; The default buffer size is 8 KB.
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;256 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;KB&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Read first commandline argument as file path
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; path &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;nth&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;no path given&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Use a buffered line reader over the file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; file &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;File&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;file does not exist&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; lines &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BufReader&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Collect the results using a HashMap
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Read the file by line
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Parse each line for a record
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Record each measurement
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        aggregate_map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;and_modify&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;or_insert_with&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tip: &lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;perf-book&#x2F;io.html#buffering&quot;&gt;IO Buffering&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Two things to define in this code is &lt;code&gt;Aggregate&lt;&#x2F;code&gt; struct and
&lt;code&gt;parse_line&lt;&#x2F;code&gt;. First, the aggregate struct, &lt;code&gt;Aggregate&lt;&#x2F;code&gt;, holds the
minimum, maximum and both the sum and count to calculate the mean of the
output:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Aggregate &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;total&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;count&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Straightforward enough definition
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Aggregate &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            total&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            count&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;total &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;total &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;count &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;count &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mean&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;total &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;count &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Second, &lt;code&gt;parse_line&lt;&#x2F;code&gt; parses a line for the city and temperature
measurement:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Can be a two tuple of (String, f32) but I prefer structs for clarity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; String,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;raw_city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; line
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split_once&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;line does not have a semicolon&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;measurement is not a f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since the data file is separated by a semicolon (&lt;code&gt;;&lt;&#x2F;code&gt;), using
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;string&#x2F;struct.String.html#method.split_once&quot;&gt;String::split_once&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;string&#x2F;struct.String.html?search=par#method.parse&quot;&gt;String::parse&lt;&#x2F;a&gt; make this easy. Once the data has
been collected, the output is sorted by city which can be done by
converting the &lt;code&gt;HashMap&lt;&#x2F;code&gt; to a sorted &lt;code&gt;BTreeMap&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; report_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; report_map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;City: {:&amp;lt;20} | &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{:.2}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt; | &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{:.2}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt; | &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{:.2}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        stat&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        stat&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mean&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        stat&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tip: &lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;perf-book&#x2F;io.html#locking&quot;&gt;stdout Locking&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;As a side note, this is not the challenge&#x27;s output format but rather
from the person asking for help which I keep here and is easier to read
although this only matters for validating the results. To visualize the
difference between output format, this is the official format:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;{Abha=-23.0&#x2F;18.0&#x2F;59.2, Abidjan=-16.2&#x2F;26.0&#x2F;67.3}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is the alternative format:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;City | Abha                 | -23.00 | 18.00 | 59.20
&lt;&#x2F;span&gt;&lt;span&gt;City | Abidjan              | -16.20 | 26.00 | 67.30
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With a working solution, how fast does it take it to run?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cargo run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt; --&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;release&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; -- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;HOME&#x2F;measurements.txt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# real        05m26.50s
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ignoring compile time and making sure it is a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch01-03-hello-cargo.html#building-for-release&quot;&gt;release build&lt;&#x2F;a&gt;, the
baseline solution is around &lt;strong&gt;&lt;strong&gt;5 minutes 26 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; which is 13 times
slower than the target. Moving forward, this will be the command I use
to check the time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;async-rust--5m51s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#async-rust--5m51s&quot; aria-label=&quot;Anchor link for: async-rust--5m51s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Async Rust (5m51s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;1e80710b6bd9c93fbb41349290913df9054c9711&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;1e80710b6bd9c93fbb41349290913df9054c9711&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The initial solution&#x27;s performance is somewhat expected given this does
not use asynchronous I&#x2F;O to avoid blocking on file reads as well as use
all cores. To enable asynchronous I&#x2F;O or &lt;em&gt;Rust&lt;&#x2F;em&gt; overall, I will be
utilizing &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&quot;&gt;tokio&lt;&#x2F;a&gt; by adding it to the dependencies:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tokio &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;version &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.36.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;features &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;full&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;] }
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Migrating to asynchronous I&#x2F;O is as simple as changing some imports from
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;fs&#x2F;index.html&quot;&gt;std::fs&lt;&#x2F;a&gt; to &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;fs&#x2F;index.html&quot;&gt;tokio::fs&lt;&#x2F;a&gt; and adding a few &lt;code&gt;await&lt;&#x2F;code&gt; points:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; From std::io and std::fs
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;tokio&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;File&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AsyncBufReadExt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; BufReader&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Enable async
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;tokio&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; file &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;File&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;file does not exist&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; lines &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BufReader&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After updating the code to &lt;code&gt;async&lt;&#x2F;code&gt;, the performance is worse at &lt;strong&gt;&lt;strong&gt;6
minutes 29 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;. Checking the process viewer, it still uses a
single thread because I did not use &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;task&#x2F;fn.spawn.html&quot;&gt;task::spawn&lt;&#x2F;a&gt; to spawn tasks on other
threads. Breaking down the current code into three tasks: read the file,
parse lines, aggregate results. This is a good starting point:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Unbounded channels to pass data between tasks
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parser_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mpsc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unbounded_channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;collector_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mpsc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unbounded_channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Task to read data and send to the parsing task
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; reader_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        parser_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Task to parse records per line and send to the collector task
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; record &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        collector_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Task to collect the records
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        aggregate_map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;and_modify&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;or_insert_with&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    aggregate_map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Wait for all tasks to finish
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;join!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reader_task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;results not sent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The code should look similar despite it being moved around to their own
task. Each task loop ends when their corresponding resource (file or
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;sync&#x2F;mpsc&#x2F;struct.UnboundedReceiver.html#method.recv&quot;&gt;channel&lt;&#x2F;a&gt;) is dropped which creates a neat and clean task dependency
without any &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;crossbeam&#x2F;latest&#x2F;crossbeam&#x2F;sync&#x2F;struct.WaitGroup.html&quot;&gt;concurrency primitives&lt;&#x2F;a&gt;. While message passing between the
channels might be adding some overhead, checking the time again reveals
a faster yet overall slower &lt;strong&gt;&lt;strong&gt;5 minutes 51 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; execution. Although
this may be a step backwards, fully utilizing &lt;code&gt;tokio&lt;&#x2F;code&gt; may take a few
adjustments.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;byte-chunks--4m49s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#byte-chunks--4m49s&quot; aria-label=&quot;Anchor link for: byte-chunks--4m49s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Byte Chunks (4m49s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;dabee7b28d628fa98b3e2c77f848779950e39119&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;dabee7b28d628fa98b3e2c77f848779950e39119&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;By reading and passing only one line, it only gives each task little to
work with and no avenue to divide the task into more workers. So reading
a whole chunk of data and spawning a parsing task for each chunk might
be more efficient.&lt;&#x2F;p&gt;
&lt;p&gt;Replacing the convenient &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;io&#x2F;struct.BufReader.html#impl-AsyncBufReadExt-for-R&quot;&gt;BufReader::lines()&lt;&#x2F;a&gt; for the more low level
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;fs&#x2F;struct.File.html#impl-AsyncReadExt-for-R&quot;&gt;File::read_buf&lt;&#x2F;a&gt; requires some thought. When reading a whole chunk of
data, only chunks that end with a newline (&lt;code&gt;\n&lt;&#x2F;code&gt;) should be sent to the
parser so it can split them neatly. For each new chunk, it is split at
the last newline and this leftover segment is merged at the beginning of
the next chunk to create a smooth data pipeline. The new reader task looks
like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; reader_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;loop &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Setting capacity is required for File.read_buf to work
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Add leftover segment
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if !&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_empty&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;extend&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Read chunk
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;fill buffer failed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf_len &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Split the chunk after (+1) the last newline.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Using Iterator::rposition is more efficient here than Iterator::position
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; by starting at the end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; newline_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rposition&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;byte &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;newline is missing&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Splitting the chunk with Vec::split_off makes this easy.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Minor edge case if the newline is the last byte
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; newline_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf_len &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            prev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split_off&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;newline_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            prev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Sanity check if the chunk is valid
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;last&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        parser_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; If fewer bytes are filled, this is the last chunk
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf_len &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since a valid chunk is now passed to the parser task, it might be more
efficient to split this chunk using a parallel processing library like
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;rayon&#x2F;latest&#x2F;rayon&#x2F;&quot;&gt;rayon&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;rayon &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.9.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The juicy function here is &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;rayon&#x2F;latest&#x2F;rayon&#x2F;slice&#x2F;trait.ParallelSlice.html#method.par_split&quot;&gt;ParallelSlice::par_split&lt;&#x2F;a&gt; which hopefully
splits the chunks faster than sequential iteration. A small caveat when
using &lt;code&gt;rayon&lt;&#x2F;code&gt; with &lt;code&gt;tokio&lt;&#x2F;code&gt; is avoiding a long-running task that can
degrade the runtime performance explained more thoroughly in this
&lt;a href=&quot;https:&#x2F;&#x2F;ryhl.io&#x2F;blog&#x2F;async-what-is-blocking&#x2F;&quot;&gt;article&lt;&#x2F;a&gt;. It is also ambiguous how thread resources should be utilized
between them without fine-tuning, but this is not a strong concern for
now.&lt;&#x2F;p&gt;
&lt;p&gt;If the chunks are now processed into a list of records, it might be also
more effective to collect the results into a mini-aggregate instead of
passing multiple records. The parsing task should be:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_tx &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Spawn a task to parse this chunk
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Since chunk ends with \n, par_split will create an empty
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; chunk, so skipping the last byte avoids this problem for
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; parse_line.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; records&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;par_split&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;byte &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; A good point to yield if parsing takes too long
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;yield_now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Collect into a mini-aggregate
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; record &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; records &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            collector_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aggregate_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since &lt;code&gt;parse_line&lt;&#x2F;code&gt; needs to take a byte slice (&lt;code&gt;&amp;amp;[u8]&lt;&#x2F;code&gt;) instead of a
string reference (&lt;code&gt;&amp;amp;str&lt;&#x2F;code&gt;), the function has to be updated:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Since slice.split_once is locked behind a feature gate, do it the
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; longer way.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; See https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;issues&#x2F;112811
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; semicolon_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; line
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rposition&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;byte &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;line does not have a semicolon&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_city &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_utf8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;semicolon_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;city is not UTF8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_measurement &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_utf8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;semicolon_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;measurement is not UTF8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lastly, the collector task is the easiest to update to combine
mini-aggregates instead of a single record:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Aggregate &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Merging two aggregates together
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;other&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;total &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;total &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; other&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;total&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;count &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;count &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; other&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;count&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Merging the smaller aggregate map to the larger one
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; other_aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; other_map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            aggregate_map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;and_modify&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other_aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;or_insert_with&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other_aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    aggregate_map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The most work by far and it does produce faster results at around &lt;strong&gt;&lt;strong&gt;4
minutes 49 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fixed-workers--5m12s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#fixed-workers--5m12s&quot; aria-label=&quot;Anchor link for: fixed-workers--5m12s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Fixed Workers (5m12s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;fb35e62c34677c3d83150695a4b4e883f1d4603f&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;fb35e62c34677c3d83150695a4b4e883f1d4603f&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;At this point, the code is similar enough to &lt;em&gt;Go&lt;&#x2F;em&gt; in its overall
approach yet it is significantly slower. Checking the process monitor
again, I did notice the memory usage was high enough to use all my RAM
and some of my swap memory which is strange as the file is read in
chunks. After tinkering with the &lt;a href=&quot;https:&#x2F;&#x2F;www.hostinger.com&#x2F;tutorials&#x2F;linux-time-command&#x2F;&quot;&gt;time format option&lt;&#x2F;a&gt; to reveal memory
stats, how much memory does the code use?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# For -f to work, use &#x2F;usr&#x2F;bin&#x2F;time instead of just time
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;which time&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;f &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Time: %E | Memory: %M | Swapped: %W | Context Switched: %w&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cargo run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt; --&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;release&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; -- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;HOME&#x2F;measurements.txt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Time: 4:52.60 | Memory: 29893648 | Swapped: 23559520 | Context Switched: 5698047
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# For comparison
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;which time&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;f &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Time: %E | Memory: %M | Swapped: %W | Context Switched: %w&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; go run 1brc_corlinp.go &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;HOME&#x2F;measurements.txt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Time: 0:26.06 | Memory: 1363336 | Swapped: 0 | Context Switched: 25325
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If I read this correctly, my code uses around &lt;strong&gt;&lt;strong&gt;30 GB&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; of memory and
occasional swap memory used compared to the &lt;em&gt;Go&lt;&#x2F;em&gt; code with only &lt;strong&gt;&lt;strong&gt;1.3 GB&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; of
memory, no swaps and fewer context switches. Clearly, the immediate
objective is to reduce excessive memory usage. Moving forward again,
this will be new command to check both time and now memory.&lt;&#x2F;p&gt;
&lt;p&gt;To address first a glaring fault in my code, I spawned an unbounded
number of parsing tasks which maybe causing some huge memory and context
switching overhead. The quick fix is to spawn a fixed number of workers
and send each incoming chunk to a worker sequentially:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; The Go code uses 256 workers
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NUM_WORKERS&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;256&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; worker_txs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;UnboundedSender&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NUM_WORKERS&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for _ in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NUM_WORKERS &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Create workers and only store their send channels
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;worker_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; worker_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mpsc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unbounded_channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        worker_txs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;worker_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_tx &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; worker_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Send each new chunk to the next worker
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; worker_iter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;worker_txs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cycle&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; I would have used Iter::cycle_mut if it existed
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; worker_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; worker_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; worker_tx &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; worker_txs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;worker_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Moved the parsing code to the worker loop
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        worker_tx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tip: &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio-task-pool&#x2F;latest&#x2F;tokio_task_pool&#x2F;&quot;&gt;Task Pool&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Side note, I did find &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio-task-pool&#x2F;latest&#x2F;tokio_task_pool&#x2F;&quot;&gt;tokio_task_pool&lt;&#x2F;a&gt; before but was not sure of its
quality and it was a good opportunity to write a simple worker pool. The
only caveat with this is fine-tuning the number of workers for
performance, but it is still slightly slower at &lt;strong&gt;&lt;strong&gt;5 minutes 12
seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;. For now, I will keep this change just to keep the memory
bounded.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;object-pool--2m53s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#object-pool--2m53s&quot; aria-label=&quot;Anchor link for: object-pool--2m53s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Object Pool (2m53s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;dfb9896c5ac3b5f51132cda611fc3c6be2b1d15f&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;dfb9896c5ac3b5f51132cda611fc3c6be2b1d15f&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Since &lt;em&gt;Go&lt;&#x2F;em&gt; uses a memory pool to &lt;a href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;doc&#x2F;gc-guide&quot;&gt;reduce heap allocations&lt;&#x2F;a&gt;, reusing
allocations as well by adding an object pool might be the way to go. One
of the biggest allocations and opportunity is the large read buffer.
Although I initially did write my own object pool and worked, I decided
to incorporate the more robust &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;object-pool&#x2F;latest&#x2F;object_pool&#x2F;&quot;&gt;object-pool&lt;&#x2F;a&gt; to the mix:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;object-pool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0.5.4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# To get the number of cores for allocation
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;num_cpus &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.16.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# To allow static initializers
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;once_cell &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.19.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I want to easily create a global object pool where I allocate one buffer
for each logical core, so that is why I also pulled in &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;once_cell&#x2F;latest&#x2F;once_cell&#x2F;&quot;&gt;once_cell&lt;&#x2F;a&gt; for
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;once_cell&#x2F;latest&#x2F;once_cell&#x2F;sync&#x2F;struct.Lazy.html&quot;&gt;once_cell::sync::Lazy&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;num_cpus&#x2F;latest&#x2F;num_cpus&#x2F;&quot;&gt;num_cpus&lt;&#x2F;a&gt; for &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;num_cpus&#x2F;latest&#x2F;num_cpus&#x2F;fn.get.html&quot;&gt;num_cpus.get&lt;&#x2F;a&gt;. Aside from the
convenience crates, the changes in the code is quite minimal:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Create a pool with a byte buffer for each core
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_POOL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Pool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Pool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;num_cpus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), || &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Reuse an available buffer
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Reusable&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_POOL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;try_pull&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    buf
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Important to work on another task first before retrying
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;yield_now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;continue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Reset the reused buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clear&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reserve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Checking out the performance of this change gives us a better &lt;strong&gt;&lt;strong&gt;3
minutes 1 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; with less memory used. If this works, what if I
apply it to the aggregates as well? Before that, the challenge specifies
a maximum of &lt;em&gt;10,000 unique cities&lt;&#x2F;em&gt;, so the overall aggregate result can
be prepared with that capacity:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NUM_CITIES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NUM_CITIES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For the mini-aggregates, waiting for an available object here is not
advisable nor am I certain what a good initial capacity is. So I opt to
allocate when needed and hope &lt;em&gt;10,000&lt;&#x2F;em&gt; or &lt;code&gt;NUM_CITIES&lt;&#x2F;code&gt; is good enough.
Another challenge rule is that the maximum length of each weather
station city is &lt;em&gt;100&lt;&#x2F;em&gt;, so each aggregate can have an estimated capacity
of the chunk size divided by that value:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CITY_LEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Likewise, a global aggregate pool
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;AGGREGATE_POOL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Pool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Pool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NUM_CITIES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, || &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CITY_LEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Reuse a mini-aggregate or create one again
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;AGGREGATE_POOL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pull&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CITY_LEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Make sure to clear before use
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aggregate_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clear&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After all the prepped allocations, the new code runs at &lt;strong&gt;&lt;strong&gt;2 minutes 53
seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; and the memory usage better at &lt;strong&gt;&lt;strong&gt;19 GB&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; which is better but
still large.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;string-interning--0m52s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#string-interning--0m52s&quot; aria-label=&quot;Anchor link for: string-interning--0m52s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
String Interning (0m52s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;f130d203e09d5b703affeb1a77b9207bbc628222&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;f130d203e09d5b703affeb1a77b9207bbc628222&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;While the object pool did help, many objects are still being allocated.
On a closer look, the code allocates a lot of city strings just to be a
key in a hash map and only sorted near the end. So what if I place every
city string in a global hash map where the key is a unique yet cheap to
copy identifier? My initial prototype was using &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;hash&#x2F;trait.BuildHasher.html#method.hash_one&quot;&gt;hash::BuildHasher&lt;&#x2F;a&gt; with
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;once_map&#x2F;latest&#x2F;once_map&#x2F;sync&#x2F;struct.OnceMap.html&quot;&gt;once_map::OnceMap&lt;&#x2F;a&gt; which is a concurrent hash map where entries can only
be inserted and not modified:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;OnceMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;OnceMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Use the map hash as the key
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hash &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hasher&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hash_one&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;raw_city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if !&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;contains_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move |_|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This concept sounded familiar and I recognized this as &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;String_interning&quot;&gt;string interning&lt;&#x2F;a&gt;.
Instead of my prototype, I decided to pull in a more mature crate like
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;lasso&#x2F;latest&#x2F;lasso&#x2F;&quot;&gt;lasso&lt;&#x2F;a&gt; for the job:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;lasso &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;version &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0.7.2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;features &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;multi-threaded&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ahasher&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;] }
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I will be using &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;lasso&#x2F;latest&#x2F;lasso&#x2F;struct.ThreadedRodeo.html&quot;&gt;lasso::ThreadedRodeo&lt;&#x2F;a&gt; with &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;ahash&#x2F;latest&#x2F;ahash&#x2F;&quot;&gt;ahash&lt;&#x2F;a&gt; as the hasher for a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tkaitchuck&#x2F;aHash&#x2F;blob&#x2F;master&#x2F;compare&#x2F;readme.md&quot;&gt;fast
keyed hash&lt;&#x2F;a&gt;. The key function is &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;lasso&#x2F;latest&#x2F;lasso&#x2F;struct.ThreadedRodeo.html#method.get_or_intern&quot;&gt;ThreadedRodeo::get_or_intern&lt;&#x2F;a&gt; that will
be used during the parsing function:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Create a global string map
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ThreadedRodeo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ThreadedRodeo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;for_strings&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NUM_CITIES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Change city to city_key as well as from String to lasso::Spur
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;city_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; Spur,
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Intern the string slice for a key
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; city_key &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_or_intern&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;raw_city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        city_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;lasso&#x2F;latest&#x2F;lasso&#x2F;struct.Spur.html&quot;&gt;lasso::Spur&lt;&#x2F;a&gt; is a 32 bit key which is much better than my 64 bit key
hash. Since the key type changed, I have to update a few types and
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;lasso&#x2F;latest&#x2F;lasso&#x2F;struct.ThreadedRodeo.html#method.resolve&quot;&gt;resolve&lt;&#x2F;a&gt; the key into a string during the sorting process which is easy
to refactor:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; report_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate_map
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Convert the key back into a string slice
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;city_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)| (&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After updating the code, it runs much faster and better at below &lt;strong&gt;&lt;strong&gt;52
seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; and with a memory usage of &lt;strong&gt;&lt;strong&gt;1.2 GB&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; which is less than
&lt;em&gt;Go&lt;&#x2F;em&gt;&#x27;s &lt;strong&gt;&lt;strong&gt;1.3 GB&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;. Amazing how much memory those small strings
contributed to the performance of the code.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;no-rayon--0m38s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#no-rayon--0m38s&quot; aria-label=&quot;Anchor link for: no-rayon--0m38s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
No Rayon (0m38s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;81c02d3701484d7e76aa852b4913bcf7a7701109&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;81c02d3701484d7e76aa852b4913bcf7a7701109&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If any small but numerous heap allocations are the issue, then &lt;code&gt;rayon&lt;&#x2F;code&gt;
is on the chopping block for &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;rayon&#x2F;latest&#x2F;rayon&#x2F;iter&#x2F;trait.ParallelIterator.html#method.collect&quot;&gt;allocating intermediate vectors&lt;&#x2F;a&gt; as part of
its parallel processing. What would happen if the code was refactored
without &lt;code&gt;rayon&lt;&#x2F;code&gt; to optimize for memory instead? Looking at
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;task&#x2F;fn.spawn_blocking.html&quot;&gt;task::spawn_blocking&lt;&#x2F;a&gt;,
it can create threads on demand as well as put the chunks into a queue
unlike &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;task&#x2F;fn.spawn.html&quot;&gt;task::spawn&lt;&#x2F;a&gt;. This means the parser workers can be reverted and
back to its simpler form:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; The parser task back to its simpler form
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parser_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; From task::spawn to task::spawn_blocking
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn_blocking&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move || &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Turn the parser into an iterator
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; record_iter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()]
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;byte &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;)
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; record_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A notable change is that parsing records is now an iterator which will
be improved later on. With this simple refactor, the time is now at &lt;strong&gt;&lt;strong&gt;38
seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; which is a minor improvement, but the code does feel less
complex without another thread pool.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;integer-arithmetic--0m36s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#integer-arithmetic--0m36s&quot; aria-label=&quot;Anchor link for: integer-arithmetic--0m36s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Integer Arithmetic (0m36s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;a43cff802f829397b814790d0ffda8066cd934d1&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;a43cff802f829397b814790d0ffda8066cd934d1&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Aside from one more minor savings in vector allocation, it might be
better to optimize in other avenues again. The challenge specifies that
the temperature measurements are floating numbers from &lt;em&gt;-99.9&lt;&#x2F;em&gt; to &lt;em&gt;99.9&lt;&#x2F;em&gt;
with the decimal number always present. Meaning instead of storing it as
a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;primitive.f32.html&quot;&gt;f32&lt;&#x2F;a&gt;, it can be stored as an &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;primitive.i16.html&quot;&gt;i16&lt;&#x2F;a&gt; where the value is multiplied by 10 to
be an integer which can take advantage of integer arithmetic and finally
divided by 10 when displayed. Seeing it may be better:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Sum is now an isize instead of f32
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; isum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; count&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Temperatures always have 1 decimal value
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; temps &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;54.3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;21.0 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;77.0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; temp &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; temps &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F;  Hypothetical value from parsing a line
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; itemp &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;temp &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    isum &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; itemp &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Convert integer sum back to f32
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MEAN: {.2}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, ((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;isum &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;count &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Changing the types are easy and added the &lt;code&gt;i&lt;&#x2F;code&gt; prefix in the field names
to indicate them as float as integer variables:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Added an &amp;#39;i&amp;#39; prefix for each variable to indicate the change
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Record &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;city_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; Spur,
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;imeasurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;i16,
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Aggregate &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;itotal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize,
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;count&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize,
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;imin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;i16,
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;imax&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;i16,
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Display function updated as well as new min and max function
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Aggregate &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;imin &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10.0
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mean&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;itotal &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;count &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10.0
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;imax &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10.0
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from some minor type casting changes, the parsing of measurement
needs to be updated since &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;primitive.f32.html#impl-FromStr-for-f32&quot;&gt;f32 parsing&lt;&#x2F;a&gt; cannot be used. The parser should
be able to handle the measurement format that boils down to:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Optional Hyphen&lt;&#x2F;li&gt;
&lt;li&gt;Digit&lt;&#x2F;li&gt;
&lt;li&gt;Optional Digit&lt;&#x2F;li&gt;
&lt;li&gt;Period&lt;&#x2F;li&gt;
&lt;li&gt;Digit&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Translating this as an iterator:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_measurement &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;semicolon_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Parsing byte by byte with an iterator
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement_iter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_measurement&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;peekable&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; 1. Optional Sign
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; If the first character is an hyphen, the number is negative and
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; advance the iterator.
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sign &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;peek&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _hyphen &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i16
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i16
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; 2. Digit
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; A neat trick to get the digit value from a byte
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; first_digit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; 3 &amp;amp; 4. Optional Digit and Period
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; If the next byte is a period, the second digit is 0; otherwise, it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; is a digit followed by a period
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; second_digit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;peek&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _period &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i16
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; digit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _period &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    digit
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; 5. Digit
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; third_digit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Safety assertion that it is the end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Calculate the integer measurement using the digits and sign
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; imeasurement &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sign &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first_digit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;100 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; second_digit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; third_digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This change improves the time to &lt;strong&gt;&lt;strong&gt;36 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parser-iterator--0m33s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#parser-iterator--0m33s&quot; aria-label=&quot;Anchor link for: parser-iterator--0m33s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Parser Iterator (0m33s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;010461659039f5820e511d0c602af07311bf2704&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;010461659039f5820e511d0c602af07311bf2704&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The last improvement with the line parsing is to minimize reading the
large buffer as much as possible. The record iterator uses the
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;primitive.slice.html#method.split&quot;&gt;slice::split&lt;&#x2F;a&gt; that reads the buffer once to pass to &lt;code&gt;parse_line&lt;&#x2F;code&gt; which.
Removing this extra iteration is a potential optimization:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; record_iter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;byte &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Extra iteration on the buffer
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tip: &lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;perf-book&#x2F;iterators.html#chaining&quot;&gt;Iterator Chaining&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The next move is to expand &lt;code&gt;parse_line&lt;&#x2F;code&gt; as an &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;iter&#x2F;index.html#implementing-iterator&quot;&gt;iterator&lt;&#x2F;a&gt; to take the whole
chunk instead of a line:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; What it should look like.
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; record_iter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ChunkParser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    ChunkParser &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; bytes &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Define the record iterator
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ChunkParser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a [u8],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Iterator &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ChunkParser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Move expanded parse_line here
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since the iterator takes a borrowed slice, the trick to consuming it is
to borrow the slice again after the first newline until it is empty. To
sanely get the index, I had to use &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;iter&#x2F;trait.Iterator.html#method.enumerate&quot;&gt;Iterator::enumerate&lt;&#x2F;a&gt; that made the
&lt;code&gt;measurement_iter&lt;&#x2F;code&gt; change its return type and slightly updated the
&lt;code&gt;parse_line&lt;&#x2F;code&gt; logic. Showing just the main changes as an iterator:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Termination condition
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_empty&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; semicolon_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;position&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;byte &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Reborrow here to make it easier for the next section
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;semicolon_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Adding Iterator::enumerate to determine the position of the last byte
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement_iter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;enumerate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;peekable&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; imeasurement &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sign &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first_digit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;100 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; second_digit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; third_digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; A newline must also be consumed now
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; newline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;newline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; If the iterator has more bytes, move to that index
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; measurement_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;peek&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next_index&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Borrow an empty slice to end the cycle
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Removing the extra iteration brings the time down to &lt;strong&gt;&lt;strong&gt;33 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;unsafe-str--0m29s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#unsafe-str--0m29s&quot; aria-label=&quot;Anchor link for: unsafe-str--0m29s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Unsafe str (0m29s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;85fbb06f4ef2941cce12bb8438e5e76e3a463460&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;85fbb06f4ef2941cce12bb8438e5e76e3a463460&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;While working on the previous change, I noticed the following line:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; city_bytes &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;semicolon_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Is the string conversion fast?
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_city &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_utf8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city_bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;city is not UTF8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The function &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;str&#x2F;fn.from_utf8.html&quot;&gt;str::from_utf8&lt;&#x2F;a&gt; checks first if the bytes are UTF-8 valid
before performing the conversion which is good. Since the data is
guaranteed to be valid, the check can be skipped in favor of
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;str&#x2F;fn.from_utf8_unchecked.html&quot;&gt;str::from_utf8_unchecked&lt;&#x2F;a&gt; to convert the type directly:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; city_bytes &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;semicolon_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Safety: Skip the validity check given the challenge data rules
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_city &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_utf8_unchecked&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city_bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) };
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tip: &lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;perf-book&#x2F;bounds-checks.html&quot;&gt;Bounds Check&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This is the only time &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch19-01-unsafe-rust.html&quot;&gt;unsafe Rust&lt;&#x2F;a&gt; is used so no need to panic. Still,
the time did go down to &lt;strong&gt;&lt;strong&gt;29 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; for just skipping data
validation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;allocation-cleanup--0m27-dot-75s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#allocation-cleanup--0m27-dot-75s&quot; aria-label=&quot;Anchor link for: allocation-cleanup--0m27-dot-75s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Allocation Cleanup (0m27.75s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;de531373fcf855860f348b4fac6f03ab2235a51f&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;de531373fcf855860f348b4fac6f03ab2235a51f&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Using the object pool did help with the memory usage. Since I limited
the number of buffers in the pool, it has to wait:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Reusable&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_POOL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;try_pull&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    buf
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; How many times does this branch trigger?
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;yield_now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;continue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Checking the branch with a counter, this branch is triggered on average
300000 times. One way to reduce the branch entry is to increase the
number of available buffers. Going that route requires
&lt;code&gt;num_cpus::get() * 32&lt;&#x2F;code&gt; or 512 buffers which increases the memory
allocations which did make it run slightly slower. Another route perhaps
is using the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bytes&#x2F;latest&#x2F;bytes&#x2F;index.html&quot;&gt;bytes&lt;&#x2F;a&gt; crate which is a more efficient shared byte buffer:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;bytes &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.5.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It is functionally an &lt;code&gt;Arc&amp;lt;Vec&amp;lt;u8&amp;gt;&amp;gt;&lt;&#x2F;code&gt; with more optimizations as well as
utilizing disjointed buffers (&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Rope_(data_structure)&quot;&gt;rope structure&lt;&#x2F;a&gt;) which coincides with
joining each chunk with the previous leftover. Since the API is similar
to &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bytes&#x2F;latest&#x2F;bytes&#x2F;struct.BytesMut.html&quot;&gt;Vec&lt;&#x2F;a&gt;, it is simply a type change:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; reader_task &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Bytes::new is zero allocation
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Create an empty buffer
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BytesMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BUF_SIZE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;loop &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Instead of using an object pool, cloning the empty buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; works well enough
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; BytesMut &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is strangely more efficient bringing the time down to &lt;strong&gt;&lt;strong&gt;27.5
seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;block-remove--0m26-dot-5s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#block-remove--0m26-dot-5s&quot; aria-label=&quot;Anchor link for: block-remove--0m26-dot-5s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Block Remove (0m26.5s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;3d5ece6377b7a88c9d3bc34998c6696694c11116&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;3d5ece6377b7a88c9d3bc34998c6696694c11116&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;To satisfy the compiler, I added &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;collections&#x2F;hash_map&#x2F;struct.Drain.html&quot;&gt;HashMap::drain&lt;&#x2F;a&gt; while refactoring on
floating to integer types for measurements:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; other_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; collector_rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; HashMap::drain so that insert works
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; other_aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; other_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;drain&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        aggregate_map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;and_modify&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other_aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Insert requires owned data
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;or_insert_with&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other_aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since I was afraid of cloning, I opted to remove entries one-by-one from
a map; however, since these are reused by the object pool when dropped,
it might be better to clone them and let &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;collections&#x2F;hash_map&#x2F;struct.HashMap.html?search=truncate#method.clear&quot;&gt;HashMap::clear&lt;&#x2F;a&gt; remove them all
at once. Also, cloning occurs only on insert which is less frequent than
modification:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aggregate_map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;and_modify&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other_aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Accept cloning
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;or_insert_with&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other_aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tip: &lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;perf-book&#x2F;heap-allocations.html#reusing-collections&quot;&gt;Reusing Collections&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This simple change drops the time to &lt;strong&gt;&lt;strong&gt;26.5 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; which is somewhat
surprising.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;no-strings--0m24s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#no-strings--0m24s&quot; aria-label=&quot;Anchor link for: no-strings--0m24s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
No Strings (0m24s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;fa1c96d209705dcf432f3710cf602fe0906a5e31&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;fa1c96d209705dcf432f3710cf602fe0906a5e31&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Reviewing the &lt;em&gt;Go&lt;&#x2F;em&gt; code, it does not actually use strings but fixed
length byte arrays specially as keys for the city name and then
displayed as a string via &lt;a href=&quot;https:&#x2F;&#x2F;pkg.go.dev&#x2F;fmt&quot;&gt;fmt.Printf&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;go&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-go &quot;&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CityName &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;byte
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fmt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;Printf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;City: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;%s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[:])
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For &lt;em&gt;Rust&lt;&#x2F;em&gt;, this means replacing the string slice (&lt;code&gt;&amp;amp;str&lt;&#x2F;code&gt;) for a byte
slice (&lt;code&gt;&amp;amp;[u8]&lt;&#x2F;code&gt;) and converting it a string slice right before output.
This does make sense and saves numerous &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;mem&#x2F;fn.transmute.html&quot;&gt;type reallocation call&lt;&#x2F;a&gt; from &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;str&#x2F;fn.from_utf8_unchecked.html&quot;&gt;byte
to string&lt;&#x2F;a&gt; slice. Since this is not doable with &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;lasso&#x2F;latest&#x2F;lasso&#x2F;struct.ThreadedRodeo.html#method.get_or_intern&quot;&gt;lasso&lt;&#x2F;a&gt;, I have to write my
own byte slice equivalent optimized for this use case. Ideally, it only
does the following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; No more str conversion
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw_city &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;semicolon_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;];
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Must take a byte slice now
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; city_key &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_or_intern&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;raw_city&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;City: {:&amp;lt;20} | &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{:.2}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt; | &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{:.2}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt; | &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{:.2}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Conversion to str moved here
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_utf8_unchecked&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;city_bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) },
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mean&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    aggregate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A quick implementation is to create a very large buffer and allocate a
segment for each unique hash of a byte slice. To make this work, I will
be adding a concurrent hash map &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;dashmap&#x2F;latest&#x2F;dashmap&#x2F;&quot;&gt;dashmap&lt;&#x2F;a&gt; and with the familiar &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;ahash&#x2F;latest&#x2F;ahash&#x2F;&quot;&gt;ahash&lt;&#x2F;a&gt; to
the fold which &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;lasso&#x2F;latest&#x2F;lasso&#x2F;struct.ThreadedRodeo.html#method.get_or_intern&quot;&gt;lasso&lt;&#x2F;a&gt; both uses internally:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dashmap &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;version &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;5.5.3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;features &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;inline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;] }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ahash &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;version &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0.8.11&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;features &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;compile-time-rng&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;] }
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;My idea looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Use ahash for the hasher
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ahash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;RandomState&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Use const generics to represent the length of a line (LEN) and the
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; maximum number of lines (CAP). Perhaps unnecessary?
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ByteStringPool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; LEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; CAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Mutex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BytesMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;segments&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Bytes, RandomState&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; LEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; CAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ByteStringPool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;LEN, CAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; The shared global buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Mutex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BytesMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;zeroed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;LEN &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Each hash is mapped to an immutable buffer region
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            segments&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;DashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity_and_hasher&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;RandomState&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; New definition
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;STRING_MAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ByteStringPool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CITY_LEN, NUM_CITIES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Lazy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ByteStringPool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;By allocating the required byte string memory needed, I am consciously
trading off memory for speed of around 1000000 bytes for every possible
city. Since it is a write-once data structure, it is easy to ignore any
locking errors as long as any data is written:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;intern&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Make sure city bytes follows the length restriction. LEN can be
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; lowered even further later on that is why this check is here.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; bytes_len &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;LEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Generate the hash or the key
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hash &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;segments&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hasher&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hash_one&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as u32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Make sure capacity is correct
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;segments&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CAP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Lock the entry if it does not exist
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Vacant&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;segments&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;try_entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Check if the buffer can be split
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_empty&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Cut a segment in the front
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; segment &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split_to&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;LEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Drop the mutex lock earlier for speed
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            drop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; BytesMut.truncate needed for BytesMut.copy_from_slice to
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; work properly
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            segment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;truncate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes_len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            segment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;copy_from_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Use BytesMut.freeze to mark it read-only
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;segment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;freeze&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    hash
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Implementing &lt;code&gt;resolve&lt;&#x2F;code&gt; is trivial but just for completion:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;u32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Bytes &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;segments&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Invalid key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Surprisingly this DIY byte string map pushes down the time enough to
beat the &lt;em&gt;Go&lt;&#x2F;em&gt; implementation at &lt;strong&gt;&lt;strong&gt;24 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; although the memory usage
did spike to &lt;strong&gt;&lt;strong&gt;4 GB&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;. Side note, I do have an even &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;312aa3caaf307218ebaa563da67c2a579cc5ee2e&quot;&gt;faster
implementation&lt;&#x2F;a&gt; of this, but it uses pointers and &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;sync&#x2F;atomic&#x2F;index.html&quot;&gt;atomic types&lt;&#x2F;a&gt; which I am
not yet well versed to explain.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tokio-tuning--0m23-dot-5s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#tokio-tuning--0m23-dot-5s&quot; aria-label=&quot;Anchor link for: tokio-tuning--0m23-dot-5s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Tokio Tuning (0m23.5s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;25322ea736e584a1f623d6d79aec67d21f0fa371&quot;&gt;Commit&lt;&#x2F;a&gt; | &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;src&#x2F;commit&#x2F;25322ea736e584a1f623d6d79aec67d21f0fa371&#x2F;src&#x2F;main.rs&quot;&gt;main.rs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Before wrapping up, time for one final tuning to make the time more
consistent. I wanted to keep the memory usage under control, but it
varies from each run the code has minimal allocations that leaves
&lt;code&gt;tokio&lt;&#x2F;code&gt;&#x27;s runtime in question. Among all configurations, I found setting
the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;runtime&#x2F;struct.Builder.html?search=Kind#method.max_blocking_threads&quot;&gt;Builder::max_blocking_threads&lt;&#x2F;a&gt; to the number of cores (16) minus each
of the main spawn tasks and current thread (4) a sweet spot in being
fast and minimizing allocations:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpus &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;num_cpus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rt &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Builder&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new_multi_thread&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max_blocking_threads&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cpus &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Runtime config error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    rt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;block_on&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;execute&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Formerly main
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;execute&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This finally brings the time around &lt;strong&gt;&lt;strong&gt;23.5 seconds&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; and &lt;strong&gt;&lt;strong&gt;0.6 GB&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; of
memory usage which finalizes my solution.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Given the same task, &lt;em&gt;Go&lt;&#x2F;em&gt;&#x27;s allocates and reuses memory really well
without much effort where most of my best time savings comes from doing
the same in &lt;em&gt;Rust&lt;&#x2F;em&gt;. While I do not necessarily want an encompassing
solution, a general automatic memory manager crate or similar that is
well documented and supported would really have closed the gap much
easily which I feel is a barren field. I only know of &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;crossbeam&#x2F;latest&#x2F;crossbeam&#x2F;epoch&#x2F;&quot;&gt;crossbeam::Epoch&lt;&#x2F;a&gt;
which is well-supported, but I do not want to deal with &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;nomicon&#x2F;atomics.html&quot;&gt;atomic ordering&lt;&#x2F;a&gt;
and nothing else seem to fit. Although the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;object-pool&#x2F;latest&#x2F;object_pool&#x2F;&quot;&gt;object_pool&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;lasso&#x2F;latest&#x2F;lasso&#x2F;&quot;&gt;lasso&lt;&#x2F;a&gt; crates
really helped as well, they do not feel like standard and accepted
solutions. Dropping &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;rayon&#x2F;latest&#x2F;rayon&#x2F;&quot;&gt;rayon&lt;&#x2F;a&gt; and writing a DIY byte string cache without
strong and obvious alternatives made me feel this hole in the crate
ecosystem. Perhaps a skill and knowledge failing on my part, I just
thought this general performance challenge would be easier to tackle
now.&lt;&#x2F;p&gt;
&lt;p&gt;My introspective takeaway though is being wary in overselling memory
efficiency as a core value seeing the gap in effort and time.
Nonetheless, I did enjoy working on this challenge in my own terms and
being rewarded in lowering the time specially by reducing allocations
and being more precise was a dopamine hit. To reiterate, this is not
about &lt;em&gt;Rust&lt;&#x2F;em&gt; vs &lt;em&gt;Go&lt;&#x2F;em&gt;, this is satisfying my curiosity why a &lt;em&gt;Rust&lt;&#x2F;em&gt;
implementation can underperform and how to resolve that with a good &lt;em&gt;Go&lt;&#x2F;em&gt;
implementation as a really tight target to which I am satisfied.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notable-attempts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notable-attempts&quot; aria-label=&quot;Anchor link for: notable-attempts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notable Attempts&lt;&#x2F;h2&gt;
&lt;p&gt;Since I already achieved my goal, I am not optimizing further than this.
I do want to note some of my other attempts that did not make it
through:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;312aa3caaf307218ebaa563da67c2a579cc5ee2e&quot;&gt;Unsafe Interner (0m23.3s)&lt;&#x2F;a&gt; - Using pointers and a faster yet uncertain
concurrent map, &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;leapfrog&#x2F;latest&#x2F;leapfrog&#x2F;&quot;&gt;leapfrog&lt;&#x2F;a&gt;, is a small gain but not sure this is worth
it.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&#x2F;commit&#x2F;825cc3c56ad479a1482c0f9f0fd349582796e19a&quot;&gt;No tokio (0m26.3s)&lt;&#x2F;a&gt; - Removing &lt;code&gt;tokio&lt;&#x2F;code&gt; in favor of raw threads with
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;crossbeam&#x2F;latest&#x2F;crossbeam&#x2F;&quot;&gt;crossbeam&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;threadpool&#x2F;latest&#x2F;threadpool&#x2F;&quot;&gt;threadpool&lt;&#x2F;a&gt; is a bust but surprisingly competitive.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Io_uring&quot;&gt;io_uring&lt;&#x2F;a&gt; - Also tried &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio-uring&#x2F;latest&#x2F;tokio_uring&#x2F;&quot;&gt;tokio_uring&lt;&#x2F;a&gt; but it does not feel ready yet and
requires setting up two runtimes which did not make it viable.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;special-mention-mo8it-obrc--0m10s&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#special-mention-mo8it-obrc--0m10s&quot; aria-label=&quot;Anchor link for: special-mention-mo8it-obrc--0m10s&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Special Mention: mo8it&#x2F;obrc (0m10s)&lt;&#x2F;h2&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;mo8it&#x2F;obrc&quot;&gt;Repo&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Special mention to &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.page&#x2F;@fn&#x2F;112162388628419615&quot;&gt;@m08bit@fosstodon.org&lt;&#x2F;a&gt; for an implementation that just
impresses me and want to add a special section on my findings about it.
It primarily uses &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;memmap2&#x2F;latest&#x2F;memmap2&#x2F;&quot;&gt;memmap2&lt;&#x2F;a&gt; where I did not notice it can be treated as a
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;memmap2&#x2F;latest&#x2F;memmap2&#x2F;struct.Mmap.html#deref-methods-%5Bu8%5D&quot;&gt;byte slice&lt;&#x2F;a&gt; which makes &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bytes&#x2F;latest&#x2F;bytes&quot;&gt;bytes&lt;&#x2F;a&gt; unnecessary as each chunk can be borrowed
directly instead of waiting for each read buffer. This also means that
the whole file data can be shared across multiple threads using
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;thread&#x2F;fn.scope.html&quot;&gt;thread::scope&lt;&#x2F;a&gt; meaning &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;tokio&#x2F;latest&#x2F;tokio&#x2F;&quot;&gt;tokio&lt;&#x2F;a&gt; is no longer needed. The general idea looks
like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; file &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;OpenOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;file does not exist&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; mmap &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Mmap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) }.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mmap failed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; mmap as a byte slice
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#033340;&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; bytes &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mmap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Divide the work to each thread
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; workers &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;num_cpus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; chunk_len &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; workers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;thread&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;scope&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;workers &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Spawn a new worker for each chunk
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; workder_handle &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; chunk &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;workers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk_len &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk_len &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; record_iter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from having a more optimized measurement parser, here are some
points that I picked up:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Replacing &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;num_cpus&#x2F;latest&#x2F;num_cpus&#x2F;fn.get.html&quot;&gt;num_cpus&lt;&#x2F;a&gt; with &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;thread&#x2F;fn.available_parallelism.html&quot;&gt;thread::available_parallelism&lt;&#x2F;a&gt; is good enough
to reduce as an dependency.&lt;&#x2F;li&gt;
&lt;li&gt;Switching from &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;collections&#x2F;struct.HashMap.html&quot;&gt;collections::HashMap&lt;&#x2F;a&gt; to &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;hashbrown&#x2F;latest&#x2F;hashbrown&#x2F;&quot;&gt;hashbrown::HashMap&lt;&#x2F;a&gt; improved the
time by seconds.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;perf-book&#x2F;inlining.html&quot;&gt;Inlining&lt;&#x2F;a&gt; is a tiny improvement but requires some testing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;perf-book&#x2F;build-configuration.html#maximizing-runtime-speed&quot;&gt;Maximizing release build&lt;&#x2F;a&gt; via &lt;code&gt;Cargo.toml&lt;&#x2F;code&gt; did slightly improve the
time.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;primitive.f32.html#method.mul_add&quot;&gt;f32::mul_add&lt;&#x2F;a&gt; or fused multiply-add is intriguing as the data seems to
be tailored for it by its 1 rounding error.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;vec&#x2F;struct.Vec.html#method.sort_unstable&quot;&gt;Vec::sort_unstable&lt;&#x2F;a&gt; might be worth looking at instead of using a
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;collections&#x2F;struct.BTreeMap.html&quot;&gt;BTreeMap&lt;&#x2F;a&gt; to sort.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;std&#x2F;primitive.slice.html#method.get_unchecked&quot;&gt;slice::get_unchecked&lt;&#x2F;a&gt; is &lt;a href=&quot;https:&#x2F;&#x2F;shnatsel.medium.com&#x2F;how-to-avoid-bounds-checks-in-rust-without-unsafe-f65e618b4c1e&quot;&gt;tricky to get working&lt;&#x2F;a&gt; as borrowing a region
might be better although worth considering.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The code is so much shorter and more efficient that I am thankful to
have learned a bit more about performance.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;resources-and-references&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resources-and-references&quot; aria-label=&quot;Anchor link for: resources-and-references&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Resources &amp;amp; References&lt;&#x2F;h2&gt;
&lt;p&gt;Much gratitude for the resources and references I used for this article:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gunnarmorling&#x2F;1brc&quot;&gt;gunnarmorling&#x2F;1brc&lt;&#x2F;a&gt; - The challenge repository&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;corlinp&#x2F;176a97c58099bca36bcd5679e68f9708&quot;&gt;1brc_corlinp.go&lt;&#x2F;a&gt; - The &lt;em&gt;Go&lt;&#x2F;em&gt; implementation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;FrancisMurillo&#x2F;onebrc&quot;&gt;FrancisMurillo&#x2F;onebrc&lt;&#x2F;a&gt; - The &lt;em&gt;Rust&lt;&#x2F;em&gt; source code repository&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;ryhl.io&#x2F;blog&#x2F;async-what-is-blocking&#x2F;&quot;&gt;Async: What is Blocking&lt;&#x2F;a&gt; - A caveat in mixing &lt;code&gt;tokio&lt;&#x2F;code&gt; and &lt;code&gt;rayon&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;nomicon&#x2F;atomics.html&quot;&gt;Rustonomicon&lt;&#x2F;a&gt; - The advanced &lt;em&gt;Rust&lt;&#x2F;em&gt; book which I referenced for unsafe
pointers and atomics.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;perf-book&#x2F;build-configuration.html&quot;&gt;The Rust Performance Book&lt;&#x2F;a&gt; - A compilation of performance tips for
&lt;em&gt;Rust&lt;&#x2F;em&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;shnatsel.medium.com&#x2F;how-to-avoid-bounds-checks-in-rust-without-unsafe-f65e618b4c1e&quot;&gt;How to avoid bounds checks in Rust (without unsafe!)&lt;&#x2F;a&gt; - Some tips for
avoiding unsafe in bypassing bounds checks.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;ref&#x2F;mem&quot;&gt;Go&#x27;s Memory Model&lt;&#x2F;a&gt; -  The official explanation of &lt;em&gt;Go&lt;&#x2F;em&gt;&#x27;s memory model&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gunnarmorling&#x2F;1brc&#x2F;discussions&#x2F;57&quot;&gt;gunnarmorling&#x2F;1brc in Rust&lt;&#x2F;a&gt; - Alternative implementations in &lt;em&gt;Rust&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;mo8it&#x2F;obrc&quot;&gt;mo8it&#x2F;obrc&lt;&#x2F;a&gt; - A remarkable yet simple implementation in &lt;em&gt;Rust&lt;&#x2F;em&gt; at
&lt;strong&gt;&lt;strong&gt;0m10s&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; just using &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;memmap2&#x2F;latest&#x2F;memmap2&#x2F;&quot;&gt;memmap2&lt;&#x2F;a&gt; and without a runtime like &lt;code&gt;tokio&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Wo Long: Fallen Dynasty (2023) - Short Thoughts</title>
          <pubDate>Sat, 11 Mar 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/wo-long-fallen-dynasty-2023-short-thoughts/</link>
          <guid>https://fnlog.dev/gamer/wo-long-fallen-dynasty-2023-short-thoughts/</guid>
          <description>&lt;h2 id=&quot;wo-long-fallen-dynasty--2023--short-thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#wo-long-fallen-dynasty--2023--short-thoughts&quot; aria-label=&quot;Anchor link for: wo-long-fallen-dynasty--2023--short-thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Wo Long: Fallen Dynasty (2023) - Short Thoughts&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Finished the game mainly offline with &lt;strong&gt;&lt;strong&gt;Dual Swords&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; on &lt;strong&gt;&lt;strong&gt;Hard Mode&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;
and using little to no magic to focus on parrying.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;My primary interest for &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Wo_Long:_Fallen_Dynasty&quot;&gt;Wo Long: Fallen Dynasty (2023)&lt;&#x2F;a&gt; is the focus on
parry gameplay as the demo sparked my interest. Sadly, I did not enjoy
the combat and gameplay barring other issues like the subpar story,
underdeveloped characters, superfluous loot and unappealing magic. I
will just tackle two problems that made my experience miserable: &lt;strong&gt;&lt;strong&gt;parry
timings&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; and &lt;strong&gt;&lt;strong&gt;morale system&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;My primary issue is the &lt;strong&gt;&lt;strong&gt;parry timings&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; from the player and enemies
which can overall feel unrewarding. First, I believe the player&#x27;s parry
window is slightly delayed, so the parry trigger must be slightly
earlier than the actual hit. In general, the longer the delay, the less
responsive it feels and more tricky to compute the offset. I do not mind
the slight delay in parry, but this becomes an issue with the next
problem.&lt;&#x2F;p&gt;
&lt;p&gt;The enemy attack animations (startup, active and recovery) are mostly
too fast or slow to parry on reaction, meaning the game focuses on
memorization rather than reactions. Having varied attack timings are
good to keep parrying a dynamic risk and reward strategy; however, the
issue rather is the tells are unreactable regardless if an attack was
fast or delayed. I also do not mind these where blocking and dodging are
safe options, but enemies take longer to &lt;strong&gt;&lt;strong&gt;fatal attack&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; making those
options punishing.&lt;&#x2F;p&gt;
&lt;p&gt;So with both fast attacks and delayed parries, it is less about reading
the animation and feeling the trigger timing but rather working
backwards from the hit to get the timing. A specific problem with this
is that startup attacks which signal the rest of the attacks are too
fast leading to haphazardly parrying any animation and missing the rest.
Another problem specially in combo chains is that parries must be
unfairly triggered even before the start of the next attack. I find the
attack animation misleading most of the time and prefer to parry while
blocking as an overall safe strategy to learn them. Although parrying
and combat do have more nuance, the overall implementation tends to
favor passive knowledge by trial and error more than actively reading
and reacting to opponents which is not for me.&lt;&#x2F;p&gt;
&lt;p&gt;The other primary issue is the &lt;strong&gt;&lt;strong&gt;morale system&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; which I believe is to
motivate exploration and balance stages. The rough idea is that the
player and enemies have a stage level and the player can increase their
level by reaching certain checkpoints or hidden areas in a stage which
starts at 0 and ends at 20. Between two combatants, the higher the
difference between their morale, the more damage the winner does and the
lower the damage the loser does. There is some nuance in manipulating
morale, but conceptually think of it as a stage level separate from the
actual character level.&lt;&#x2F;p&gt;
&lt;p&gt;Assuming the player character is on the recommended character level on a
new stage, the morale system serves to direct players to an intended
path and accumulate enough morale by the end to fight the 20 morale
boss. The problem is that collecting every morale points will always
total 20 morale that is simply fighting the boss with equal morale;
however without the collecting the hidden (around 6 or 7 morale) morale,
boss fights tend to be at a disadvantage. The stages are big and
non-trivial so finding those missing flags can feel like busywork and
demoralizing specially if the boss is difficult. This also hurts stage
replays whether for farming or grinding as the hidden morale points must
still be collected even though the stage is already beaten. So
exploration is required for a fair fight, not something that will give
an advantage say 22 or 23 player morale to make it worthwhile.&lt;&#x2F;p&gt;
&lt;p&gt;As a stage balancing mechanic, it feels very artificial. Before any
fights, the player has to always check their morale against their
target&#x27;s morale which encourages the player finding better odds
typically the intended route. While weaker enemies may be sometimes
stronger, difficult enemies have higher morale while guarding
checkpoints, so important fights tend to be at a disadvantage despite
the inherent skill difficulty. While this also deters taking alternative
routes, the stages rarely have alternative routes as they are optional
challenges rather than choices. I think morale is also holding back more
varied level design despite how big they are because of how damage and
exploration are tied together.&lt;&#x2F;p&gt;
&lt;p&gt;As a risk&#x2F;reward mechanic, it is very punishing on death where extra
morale is lost and reset back to the morale checkpoint known as
&lt;strong&gt;&lt;strong&gt;fortitude&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;. The primary way to acquire extra morale is to defeat
enemies and execute fatal attacks up to 25 morale. First, morale is not
usually farmed but rather gained throughout the stage, so dying would
put the player more at a damage disadvantage where they last left off.
Second, the player losses morale whenever they are hit with a fatal
strike commonly from bosses, making it harder to win with less damage.
Lastly for bosses, they reset their morale to 20 whenever it drops via
fatal strike, so doing well does not make boss fights easier. The player
always has to work more for a slight advantage but more to lose.&lt;&#x2F;p&gt;
&lt;p&gt;In summary, the morale system in this game forces exploration and
disadvantages upon the player. I feel the morale system is a lost
opportunity to be more an active resource rather than a static number
possibly as items, buffs, debuffs, decisions and so on. The strange
thing is that the morale in &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Dynasty_Warriors&quot;&gt;Dynasty Warriors series&lt;&#x2F;a&gt; is a good global
system as it affects other active units and alters the flow of battle as
well as swings back and forth more dynamically with events unfolding in
the battlefield. Perhaps they just have the same name, but the potential
was clearly there.&lt;&#x2F;p&gt;
&lt;p&gt;This game was clearly not for me despite my early enthusiasm for it, but
nonetheless this still offers some challenge and value on sale.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Batman: Return To Arkham - Notes and Thoughts</title>
          <pubDate>Thu, 08 Dec 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/batman-return-to-arkham-notes-and-thoughts/</link>
          <guid>https://fnlog.dev/gamer/batman-return-to-arkham-notes-and-thoughts/</guid>
          <description>&lt;h2 id=&quot;batman-return-to-arkham&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#batman-return-to-arkham&quot; aria-label=&quot;Anchor link for: batman-return-to-arkham&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Batman: Return To Arkham&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Completed the main story, collected every Riddler trophy and beaten
every challenge (predator and combat) for &lt;strong&gt;&lt;strong&gt;Arkham Asylum&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; and &lt;strong&gt;&lt;strong&gt;Arkham
City&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; on &lt;strong&gt;&lt;strong&gt;hard mode&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;In honor of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Kevin_Conroy&quot;&gt;Kevin Conroy&lt;&#x2F;a&gt;&#x27;s passing, I decided to replay &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Batman:_Arkham_Asylum&quot;&gt;Batman: Arkham
Asylum&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Batman:_Arkham_City&quot;&gt;Batman: Arkham City&lt;&#x2F;a&gt; among other things to pay tribute. I
abhor &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Batman:_Arkham_Knight&quot;&gt;Batman: Arkham Knight&lt;&#x2F;a&gt;&#x27;s nonsensical and botched story as well as
the crappy car combat that I refuse to play it. For my playthroughs, I
played on the hardest difficulty, collected every viable secret or
collectible and completed the challenge arenas and maps to understand
the game&#x27;s strengths and flaws. My attraction to both games are its
casual yet versatile combat and stealth gameplay although not for its
serviceable story; however, completing every optional content and
imprecise combat is where it hampers the experience. I do like and
recommend both games as a casual &lt;em&gt;Batman&lt;&#x2F;em&gt; game but my overall experience
was negative when completing them as a completionist.&lt;&#x2F;p&gt;
&lt;p&gt;For this article, I will assume the reader is familiar or played both
games so I will not be detailing the game mechanics mentioned instead
focusing on its design and implementation. I will be primarily writing
about the issues of both games and primarily using the first game as a
point of reference since the second game mostly improved on the first
game.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;padded-metroidvania&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#padded-metroidvania&quot; aria-label=&quot;Anchor link for: padded-metroidvania&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Padded Metroidvania&lt;&#x2F;h2&gt;
&lt;p&gt;As a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Metroidvania&quot;&gt;metroidvania&lt;&#x2F;a&gt;, backtracking for collectibles and secrets is an issue
in both games. Fundamentally, the incentive to retread old areas with
new tools for rewards is not very fulfilling for a few experience points
specially the many &lt;em&gt;Riddler trophies&lt;&#x2F;em&gt;. Since several rewards are locked
by late gadgets, the player is punished for coming back earlier and that
some of them are simply using the new gadget without posing some
challenge. Most importantly, barely any changes in the old areas like
new enemy configurations or optional challenges for a stronger reason to
revisit. Another issue is the lack of exits where the player has to
travel all the way back after reaching the end or simply unnecessary
retreading. Aside from completion, the player has no incentive to
explore old areas and is wasting their time.&lt;&#x2F;p&gt;
&lt;p&gt;An issue specifically as a completionist is that, the collectibles feel
like checklists when they are revealed instead of encouraging discovery.
Since the game is not really about exploration, this is understandable
cheap padding but conflicts with its &lt;em&gt;metroidvania&lt;&#x2F;em&gt; design. I think just
not allowing players to come back to old areas until the end of the game
or simply not having those &lt;em&gt;Riddler trophies and riddles&lt;&#x2F;em&gt; would be a
better design. The Easter eggs and references can just be those without
external rewards or pressures. I do like the interview tapes and lore
but I think they can be reworked as rewards for the optional content.&lt;&#x2F;p&gt;
&lt;p&gt;These issues are primarily felt in the first game specially with the
lack of horizontal navigation even if the &lt;em&gt;line launcher&lt;&#x2F;em&gt; is a subpar
solution and the lack of exits in long corridors. The workflow is
running to every room on foot (or wire), finding every collectible and
repeating this process on the remaining room and levels which is tiring
and boring. The second game fixes some of the prior issues with the
&lt;em&gt;grapple boost&lt;&#x2F;em&gt; for horizontal mobility, better challenges, improved
side quests and &lt;em&gt;Riddler informants&lt;&#x2F;em&gt; but suffers from the same issues.
&lt;em&gt;Catwoman&lt;&#x2F;em&gt; amplifies this issue of backtracking where &lt;em&gt;Batman&lt;&#x2F;em&gt; has to
discover and open the path first rather than independently which feels
worse. While I praise the new and better challenges, a huge amount of
repetitive and boring &lt;em&gt;Riddler trophies&lt;&#x2F;em&gt; are still peppered throughout
the map. I feel the game wasted my time since I have to do this to
unlock the other more intriguing optional challenges.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lenient-stealth&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#lenient-stealth&quot; aria-label=&quot;Anchor link for: lenient-stealth&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Lenient Stealth&lt;&#x2F;h2&gt;
&lt;p&gt;While I like how much gadget variety is offered, the game does not push
the players to act creatively or aggressively by offering too much
safety in vantage points and wall hacks. Although the game rewards
gadget variety, it is small and does not penalize camping. While the
second game offered many adaptive solutions such as destroying vantage
points, communication jammers, armored enemies requiring noisy
takedowns, mines, hostages and so on, but the underlying issue is not
really addressed. I do like the &lt;em&gt;detective vision&lt;&#x2F;em&gt; as an accessibility
option to better see and find options such as breakables or
interactables, but do not like how it trivializes the stealth gameplay.
My suggestion is to simply design rooms without vantage points or cheap
exits, reduce experience points when using those options by half or so,
decrease the value of silent takedown while increasing the other
options, a time limit that may or may not increase with takedown, rework
the &lt;em&gt;detective vision&lt;&#x2F;em&gt; to reveal enemies with a limited use noisy sonar
for a short period of time similar to the &lt;em&gt;sonic batarang&#x27;s explosion&lt;&#x2F;em&gt;
or any of these would just be direct incentive to be more proactive.&lt;&#x2F;p&gt;
&lt;p&gt;As a revealing anecdote, I avoided using vantage points and &lt;em&gt;detective
vision&lt;&#x2F;em&gt; in my playthrough to heighten my experience; however, the final
&lt;em&gt;Riddler challenge&lt;&#x2F;em&gt; I had left involves executing an inverted takedown
and since predator rooms do not respawn, I had to start &lt;em&gt;New Game Plus&lt;&#x2F;em&gt;
to complete it which is almost funny but mostly sad.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;disempowering-combat&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#disempowering-combat&quot; aria-label=&quot;Anchor link for: disempowering-combat&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Disempowering Combat&lt;&#x2F;h2&gt;
&lt;p&gt;This is my greatest grievance with the &lt;em&gt;Arkham&lt;&#x2F;em&gt; game series. The combat
system works well at a casual level but executing it well specially with
the second game&#x27;s hardest combat arena, &lt;em&gt;The Joker&#x27;s Carnival&lt;&#x2F;em&gt;, shows
how poorly it feels at a high level. Most of the time whenever the
player commits an error, the question should be how can they correct
their mistake, but here it is how did the game caused it. The following
issues show a loss of player accountability discouraging mastery and
skill over both games.&lt;&#x2F;p&gt;
&lt;p&gt;The worst issue is the imprecise attack targeting where the wrong target
is attacked which happens most of the time specially in between combos.
After completing the hardest combat challenge, I still do not know how
targets are chosen and only adapt based on the targets in that
direction. As long as enemy is between the intended target, the player
always has to anticipate that the next target is the one in between no
matter how precise the analog controls are. This is also why disarming
shields and stun batons or special takedowns of armored enemies is
always a priority to avoid hitting them by accident. An attack target
indicator would help this issue like what the third game did but my
experience with it has been underwhelming. I am not sure if there is
even a perfect implementation of this targeting but it still feels
disruptive when the wrong target is hit.&lt;&#x2F;p&gt;
&lt;p&gt;Outside of &lt;em&gt;freeflow focus&lt;&#x2F;em&gt;, random normal attack timings is the next
issue. While I appreciate the number of animations, the inability to
select the fastest attack animation often leads to a counterattack from
an enemy jab which seems faster than any of player attacks. The worse
feeling is losing to an attacking an enemy before they choose their
attack because a high flying long committal move was chose which does
not teach anything but only being unlucky. Attacking far away enemies is
the only lesson here but since the attack targeting is also not
accurate, it feels the game is making the error rather than the player.
Even the fixed animation of the cape can still be beaten by a jab, so
the best option is to actually attack an enemy after an dodge which
feels bad.&lt;&#x2F;p&gt;
&lt;p&gt;I do not know the term for this design where enemy slides in place to
attack the player or similarly to &lt;em&gt;Batman&lt;&#x2F;em&gt; attacking far away enemies
but I will call it here as &lt;strong&gt;&lt;strong&gt;attack magnetism&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;. When a player sees an
incoming attack, the player needs to determine whether to continue their
current action if they knew it would not hit or acknowledge it with a
counter, dodge or quick action. For example, the aggressive option is to
attack a far away opponent to put the player out of range while
maintaining the offense. The issue is that the &lt;em&gt;attack magnetism&lt;&#x2F;em&gt; is
unpredictable or ambiguous whether it would still connect with the new
position specially with the pipe, push kick or double thug attacks which
have a deceptively long ranges. Precise countering is also not a
solution as its range is also unpredictable leading to a lost combo. My
suggestion is to show counter range like a dotted circle in the floor,
remove the attack indicator if the attack will not hit similar or
something to that effect. Between the unpredictability of counters and
&lt;em&gt;attack magnetism&lt;&#x2F;em&gt;, dodging is the most consistent way to reset their
attacks which feels underwhelming.&lt;&#x2F;p&gt;
&lt;p&gt;Another issue is the auto-adjusting camera where after attacking an
enemy, the camera adjust slightly to face towards it; however, it
disorients the next movement possibly causing a failed attack. It also
is too close to the player where long reaching attacks such as pipes or
swords behind the camera cannot be reacted to. Also when attacking
enemies outside the camera, a cape stun is always the safest option if
it hits an armored, shield or stun baton enemy. This issue would be easy
to fix with options to disable auto-adjustment, increasing the field of
view and possibly making it more top-down to feel more in control of the
field. As an accessibility point, the auto-adjusting camera can induce
motion sickness specially attacking far away enemies quickly which I
occasionally in my numerous attempts.&lt;&#x2F;p&gt;
&lt;p&gt;Although this may be possibly on the player&#x27;s side, the input system
seems to be broken at times. I felt this the most when dodging at attack
but the dodge does not execute. Other times executing a button
combination does not work as intended such as countering a weapon attack
(shield or knife) when a disarm was intended. It could be my fault for
being slow, jittery or incorrect with timings or buffering, but more
often than not I notice these moments as frequent enough to warrant a
mention.&lt;&#x2F;p&gt;
&lt;p&gt;The two factors at the highest level are speed and score by maintaining
the combo counter. With all these issues and objective in mind, the
safest and fastest way to play is to attack once (or twice if in
&lt;em&gt;freeflow focus&lt;&#x2F;em&gt;) and then quickly dodge (or preferably jump over an
enemy or attacker) to reset attack animations. Counters, aside from its
unpredictability, are also discouraged since it is the slowest option
unless it is with multiple enemies although they can still be used as
breathing space and at close range. Blade counters are also risky and
dangerous specially as titans or one-armed thugs can interrupt them.
Achieving the &lt;em&gt;freeflow focus&lt;&#x2F;em&gt; is also mandatory when dealing with
tougher or faster enemies such as safely stunning titans or damaging
one-armed thugs. The overall strategy feels like a defensive mitigation
of randomness and unpredictability in the combat system instead of being
in control with all the gadgets and controls.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;concluding-thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#concluding-thoughts&quot; aria-label=&quot;Anchor link for: concluding-thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Concluding Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;Regardless of my negative experience, I do recommend the first and
second game, but do not expect completion be pleasant nor mastery be a
rewarding experience.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;RIP Kevin Conroy&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Belle (2021) - Notes and Thoughts</title>
          <pubDate>Fri, 02 Sep 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/watcher/belle-2021-notes-and-thoughts/</link>
          <guid>https://fnlog.dev/watcher/belle-2021-notes-and-thoughts/</guid>
          <description>&lt;h2 id=&quot;belle--2021&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#belle--2021&quot; aria-label=&quot;Anchor link for: belle--2021&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Belle (2021)&lt;&#x2F;h2&gt;
&lt;p&gt;As a fan of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Summer_Wars&quot;&gt;Summer Wars (2009)&lt;&#x2F;a&gt; abstract virtual world, I had to watch
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Belle_(2021_film)&quot;&gt;Belle (2021)&lt;&#x2F;a&gt; to see it again. Inspired from &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Beauty_and_the_Beast_(1991_film)&quot;&gt;Disney&#x27;s Beauty and the
Beast (1991)&lt;&#x2F;a&gt;, the film follows a high school girl (&lt;em&gt;Suzu&lt;&#x2F;em&gt;) regaining the
ability to sing and finding her place in as an idol (&lt;em&gt;Bell&lt;&#x2F;em&gt; or &lt;em&gt;Belle&lt;&#x2F;em&gt;)
in virtual space (&lt;em&gt;U&lt;&#x2F;em&gt;) then reaching out to a violent avatar (&lt;em&gt;Beast&lt;&#x2F;em&gt;)
similar to its inspiration; however, I did not emotionally nor musically
resonate with it because of the confusing artificiality of it all. For
casual viewing, the film is still okay with its great visuals, but it
fails to leave a strong mark like its predecessor to be strongly
recommended.&lt;&#x2F;p&gt;
&lt;p&gt;Starting with my issue with its Disney inspiration. If a film closely
uses or references another story, I prefer if it builds upon it or
creates its own original work from it rather than just referencing key
moments or ideas. For its Disney film inspiration, it is hitting those
iconic references such as the beast, castle, rose, ballroom dance,
fearmongering, mob attack and so on. While following templates or
structures is not necessarily bad, the film does not go beyond enough to
avoid reminding me of a better film.&lt;&#x2F;p&gt;
&lt;p&gt;What else it took is the songs. Instead of songs being a dramatic plot
device or character expression is now diagetic or literal singing which
removes the plot efficiency and creativity. For my favorite Disney film,
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Mulan_(1998_film)&quot;&gt;Mulan (1998)&lt;&#x2F;a&gt; songs quickly establish the setting, show character values
or inner conflicts, move the story and mark key moments. While the
avatar singing has character and plot uses, it feels narratively slower
and less interesting to interpret and watch. While the film does not
have as many songs, I wish they were more notable aside from their
emotional qualities.&lt;&#x2F;p&gt;
&lt;p&gt;Moving past my grief about its reference to the film itself. The film
feels incidental with its main conflict who the real user of the &lt;em&gt;Beast&lt;&#x2F;em&gt;
is. While a virtual police force somewhat exists to do exactly that, the
protagonist and her friend decide to do it themselves out of petty
revenge or curiosity for crashing one of their concerts. As with the
inspiration, the &lt;em&gt;Beast&lt;&#x2F;em&gt; is eventually portrayed as sympathetic or
abused despite the actual crimes, but the protagonist loses their
motivation with the hunt leaving the story hanging. I would like to see
the protagonist actually speak out to support the &lt;em&gt;Beast&lt;&#x2F;em&gt; which would be
a strong gesture and character moment rather than being forced to gain
trust when the story demands them to. Without spoiling the last act, the
real &lt;em&gt;Beast&lt;&#x2F;em&gt; needs help and the protagonist decides to do it herself
instead of calling the appropriate government services which feels
dangerous and questionable despite being a character development moment.
Although I have more issues with some minor plot points, the overall
plot seems just to accommodate its key emotional moments rather than a
coherent and meaningful one.&lt;&#x2F;p&gt;
&lt;p&gt;The next point is how uninteresting the characters. I barely know their
values and interests specially the &lt;em&gt;Beast&lt;&#x2F;em&gt; who is the focus of the later
half of the film. The character dialogue as well is not intriguing
specially theatrical from the police leader. I think the film can
replace the romance plots and unveiling plot device with more meaningful
character interactions and dialogue subtext. What saddens me is that I
do not feel attached to any character in the film even the underwhelming
protagonist.&lt;&#x2F;p&gt;
&lt;p&gt;Concerning my main point of interest. The film places a special emphasis
on unveiling or revealing the identity of a virtual world user. In this
virtual world, the avatar is directly generated from the user&#x27;s body
signature or biometrics so that each one is unique and corresponds to a
unique and identifiable user which also implies no alternative accounts
are possible. So what is the justice served by unveiling a user? While
users already reveal their identity when communicating outside the
virtual world, a user&#x27;s identity is private information and disclosing
it forcibly or without consent is an attack on their privacy and safety.
I do not know if the film realizes the main form of virtual justice is
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Doxing&quot;&gt;doxing&lt;&#x2F;a&gt;. What bothers me is that banning a user would be a more practical
and ethical solution when dealing with bad actors in online communities.&lt;&#x2F;p&gt;
&lt;p&gt;The police force in this virtual world is known as the &lt;em&gt;Justices&lt;&#x2F;em&gt; but
are not formally governed by the world&#x27;s administrators. In fact, the
world may not have any administrators or ruling body but rather a
lawless and independent world where justice may be only an emerging
social need. If the &lt;em&gt;Justices&lt;&#x2F;em&gt; are a community group and administrators
are non-existent, how did the &lt;em&gt;Justices&lt;&#x2F;em&gt; get the ability to unveil other
users that are administrative capabilities? Ignoring the fact that
unveiling has commercial sponsors, would there not be more support or
utility groups such as builders, merchants, cosmetic designers and so
on? The focus on the police force raises so many questions about the
world and makes the world feel more flat without other representative
groups. Perhaps if they made the martial arts users as bounty hunters
instead would make for a more colorful task force without raising
issues.&lt;&#x2F;p&gt;
&lt;p&gt;My last issue is the virtual world itself. Ignoring the possible privacy
violations of harnessing user biometric data, the user having only one
identity is a major ethical and economic concern. The virtual world was
supposed to give users another identity that should be ideally equal or
fair across users; however, the protagonist gets an avatar that is
endowed with beauty and voice which is apparently a rare trait since
nobody can contest her angelic music. In a way, this new world
replicates the same inequalities of class and privilege by merely giving
beyond cosmetic changes. When &lt;em&gt;Bell&lt;&#x2F;em&gt; became popular, the best friend
acknowledges the profits from singing but sends them to charity instead
to avoid changing the status quo; however, the point stands that the
protagonist is a rich and privileged celebrity. Some skills and traits
naturally carryover like charisma, intellect or combat prowess but
giving different advantages because of genetic or environmental
differences is a balance issue in gaming terms. Considering its Disney
reference, the Disney protagonist was beautiful and well-read but an
outcast. Maybe &lt;em&gt;Bell&lt;&#x2F;em&gt; could still sing but be a minor idol instead to
avoid this inequality issue.&lt;&#x2F;p&gt;
&lt;p&gt;Regarding the lack of expression and freedom with this avatar
generation. What happens if the person does not like their appearance?
It could be argued that it removes physical beauty standards by leaving
it out the user but not having at least some options can be
psychologically or emotionally detrimental specially the body conscious.
Not allowing multiple accounts also restricts a user from exploring
different identities or protect their anonymity. I understand that a
unique identity prevents spam or abuse; however, this virtual world has
no safeguards in the first place, so what is the point of this loss of
privacy and creativity? I wish the film just allow users to randomly
generate their avatars as many times and some ability to check a user&#x27;s
public profile to sweep this issue away.&lt;&#x2F;p&gt;
&lt;p&gt;While I do have other issues with the virtual world, I raised some
possible solutions while maintaining the technological and abstract
fantasy of it; however, I really think all this is in service of the
high emotional moment where the protagonist is unveiled and sings which
is the crux of my problems. I think the film is going for a
technological optimism specially how it grants the protagonist the
ability to sing again and perhaps strength to the abused, but how
everything is constructed seems to go against that which is a shame. The
film can still be enjoyable, but I would just rewatch &lt;em&gt;Summer Wars&lt;&#x2F;em&gt;
again for a better story, characters and visual experience.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Teenage Mutant Ninja Turtles: Shredder&#x27;s Revenge - Notes and Thoughts</title>
          <pubDate>Sun, 10 Jul 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/teenage-mutant-ninja-turtles-shredder-s-revenge-notes-and-thoughts/</link>
          <guid>https://fnlog.dev/gamer/teenage-mutant-ninja-turtles-shredder-s-revenge-notes-and-thoughts/</guid>
          <description>&lt;h2 id=&quot;teenage-mutant-ninja-turtles-shredder-s-revenge&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#teenage-mutant-ninja-turtles-shredder-s-revenge&quot; aria-label=&quot;Anchor link for: teenage-mutant-ninja-turtles-shredder-s-revenge&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Teenage Mutant Ninja Turtles: Shredder&#x27;s Revenge&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Finished story mode on XBox at Hard difficulty with April&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;As a fan of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Streets_of_Rage_4&quot;&gt;Streets of Rage 4&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Teenage_Mutant_Ninja_Turtles:_Shredder&amp;#x27;s_Revenge&quot;&gt;Teenage Mutant Ninja Turtles: Shredder&#x27;s
Revenge&lt;&#x2F;a&gt; is another good brawler with a casual multiplayer focus. I do
not have nostalgia for the franchise, so my thoughts are of it as a solo
brawler. I can excuse a lack of features and quality of life such as a
better lobby system, key bindings&#x2F;macros, advanced tutorials, but the
core combat is a bit messy and unpolished in a few ways.&lt;&#x2F;p&gt;
&lt;p&gt;The first choice players make is selecting their character. Although
they differ in stats (power, range and speed) and move effects, they all
practically control the same that lowers character complexity and
uniqueness. While this design choice is meant for a casual audience, the
problem is that these characters still have their differences in their
specials and combos which can deceive and mislead players of its
possible depth. If the player community is ranking characters, the game
is doing itself a disservice. While I prefer mechanical differences,
adding character specific tutorials, videos or indicators would have
easily solved this.&lt;&#x2F;p&gt;
&lt;p&gt;For the meat of the game, the combat system is quite fluid with
animation canceling and the anti-air move. While I do want advanced
concepts like hitting enemies of the ground or wall, enemies have such a
low health pool that I understand its exclusion. Talking about its
issues, I have three major issues which players can get hit unfairly.
The first is that normal moves cannot cancel into special moves
instantly which is vulnerable window. The second is that grabs are
implemented poorly and risky without any invincibility frames, crowd
control or strong damage specially where grabs can be accidental. The
third is the attack magnetism or homing nature of the running and dodge
attack which can hit the wrong enemy, ruin positioning or flow. Other
than that, the combat is okay although more mechanics and options are
welcome.&lt;&#x2F;p&gt;
&lt;p&gt;Considering enemy design next, I do not like how almost all enemies can
anti-air which makes aerial attacks unsafe or risky. Perhaps only
certain enemies can anti-air which would signal against anti-air than
being guesswork. Some enemies can block where grabs should have
effective; however, grabs have their own issue and the other options
such as special moves are more viable. Certain enemies can also cancel
grabs unless they have been damaged which has no clear indicator. A
special grab action can remove an enemy instantly which I think the game
is preventing for these special enemies. Perhaps removing that optional
grab action can allow grabs to be more consistent. Some enemies have
power armor before attacking which means failing to interrupt or stagger
enemies. Overall, fighting enemies do not feel predictable and getting
hit randomly is a symptom of that.&lt;&#x2F;p&gt;
&lt;p&gt;Compounding those issues, bosses feel unfair and clunky. In particular,
bosses have an attack and vulnerable phase where players have to evade
attacks before actually doing damage or risk taking damage. An issue
with this is once they take damage they go into an armored counterattack
which limits the possible damage dealt and risk taking damage making
fights longer or more passive. The last boss is specially guilty of this
with such a long attack phase that the only thing the player can do is
dodge and taunt. The hitboxes of some of their attacks are also unclear
or deceptive which is a problem with 2D brawlers in general but more
annoying with their higher damage. In general, bosses have so many issues
and may feel frustrating to fight rather than a genuine challenge.&lt;&#x2F;p&gt;
&lt;p&gt;I will not be talking about the level design, but I do want to address a
strange yet game breaking issue. Executing special attacks require a
resource which can be partially charged on attacking but fully lost on
taking a hit. This mechanic encourages defensive play while being
aggressive, although I disagree with this since special moves are used
as panic defensive options. Surprisingly, completing a taunt gives the
player one special move resource without ever attacking which is absurd.
In story mode, the maximum special move resource is 3 meaning a player
can refill room clearing special moves before each encounter and the
only thing discouraging this behavior is the forgiving hit counter. This
is also unbalanced in multiplayer as players can taunt while waiting for
the other players to finish their parts. In arcade mode, this is
somewhat fixed with 1 special move limit, but it does limit special
moves as a resource. Perhaps limit 1 resource gained through taunting is
acceptable or removing it altogether is better, but this considerably
affects boss damage and health which leads into a bigger design and
balance issue.&lt;&#x2F;p&gt;
&lt;p&gt;While I cannot speak about the quality of online play since I
disconnected frequently, the overall game as a solo experience does not
feel worth investing my time in with all its faults. It is an okay game
to reinvigorate the franchise, but it needs more features and fixes to
make this a good product to truly recommend.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Fights in Tight Spaces - Notes and Thoughts</title>
          <pubDate>Mon, 30 May 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/fights-in-tight-spaces-notes-and-thoughts/</link>
          <guid>https://fnlog.dev/gamer/fights-in-tight-spaces-notes-and-thoughts/</guid>
          <description>&lt;h2 id=&quot;fights-in-tight-spaces&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#fights-in-tight-spaces&quot; aria-label=&quot;Anchor link for: fights-in-tight-spaces&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Fights in Tight Spaces&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Finished the game on XBox with Slasher, Aggressive, Grappler and
Counter-Striker decks at Purist (hardest) difficulty.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I love and thirst for &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Metal_Gear_Acid&quot;&gt;Metal Gear Acid&lt;&#x2F;a&gt;&#x27;s combat system, so I was excited
when I found &lt;a href=&quot;https:&#x2F;&#x2F;www.fightsintightspaces.com&#x2F;&quot;&gt;Fights in Tight Spaces&lt;&#x2F;a&gt; that combines its solo character
grid-based combat with the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Roguelike_deck-building_game&quot;&gt;roguelike deck-building&lt;&#x2F;a&gt; genre to be an
addictive twist. The unique mechanic of this game aside from movement as
a resource is the combo counter which goes up for each attack but
decreases for each tile movement. This counter can be a card requirement
which usually provides good crowd control effects and&#x2F;or high damage
scaling but can be detrimental or dead cards if it is not attained. I
like this mechanic as it encourages aggressive plays while discouraging
movement if the player uses combo cards. In terms of gameplay, I do not
have much to say since it follows since it follows the genre formula of
picking a starter deck and finishing five levels within two to three
hours. Although it is not as deep or complex as its contemporaries, I
still recommend this game for hungry fans of &lt;em&gt;Metal Gear Acid&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from the deck drafting mode, the game offers six starting decks
each with its own strengths and weakness:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Balanced&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;
: Good movement and damage&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Counter-Striker&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;
: High defense and counterattacks but lacks
mobility&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Aggressive&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;
: High damage attacks but requires maintaining combo&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Slasher&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;
: Good mobility and bleed stacking but lacks crowd
control and damage&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Grappler&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;
: Good throws and crowd control but lacks both
mobility and defense&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Trickster&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;
: Gimmick attacks and damage but less consistent
because of the randomness&lt;&#x2F;p&gt;
&lt;p&gt;I love the game, but my only big criticism is the lack of endgame
content usually expected by its genre. Once you finish the game, the
only incentive left is to finish it with the other starter decks. Aside
from starting at a harder level, the game could use more difficulty
modifiers, randomized bosses, starting characters, items and card
effects specially a viable ranged build, but this might be
understandably beyond the scope, budget and balance of the game.&lt;&#x2F;p&gt;
&lt;p&gt;For some of its minor issues, optional combat objectives such as pushing
enemies of the ledge or finishing within a certain number of terms need
to be more lenient since some starter decks cannot viably fulfill them
such as pushing with the &lt;em&gt;Counter-Striker&lt;&#x2F;em&gt; or sometimes just randomness.
Although optional, these objectives commonly offer money to upgrade or
remove cards and sometimes more importantly losing health, combo or turn
upgrades which can be devastating in the long run. Until the player
recognizes their value, players are not encouraged to plan their routes
for their preferred upgrades which leads into another issue.&lt;&#x2F;p&gt;
&lt;p&gt;The overall level (node and branch) design is very flat where any
decision fork converges at most within three nodes which lowers its
strategic depth in favor or simplicity. While this may be a valid design
choice, it is one of the most visible areas of improvement. If it did
have more variety, I would not just beeline for the nearest gym, hunt
for every turn upgrades and occasionally rescue an informant or
ambassador for heals. In fact, the medical center seems to be useless
for healing assuming the player never take risks with long-term injuries
which I am not sure is good design. If the game wanted to lean on this
simple and flat level design, it could add some unique narrative
immersion with simple randomly generated story beats why the branches
diverge and converge like something in &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;This_War_of_Mine&quot;&gt;This War of Mine&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;As with &lt;em&gt;Metal Gear Acid&lt;&#x2F;em&gt;, having enough movement cards in a deck so
that players draw at least one on average is important specially where
not moving could mean taking unavoidable damage which feels bad. With
all starting decks, I found the game does not provide enough movement
cards for a more balanced experience regardless of some advancing
attacks or movement starting items. Some decks start with two turn cost
cards which is too early while starting with three turns although combo
cards here work. While it is good the starting decks represent different
perspectives, they can be tuned better for newer players.&lt;&#x2F;p&gt;
&lt;p&gt;I have other smaller issues like the replay, lack of animation skipping
and card balancing, but overall the game clicked with me and perhaps a
sequel could introduce more content, depth and difficulty. I suggest
also playing on &lt;em&gt;Purist&lt;&#x2F;em&gt; difficulty so that planning turns is an
important process which I think should be the default difficulty and
make the more lenient ones instead accessibility options.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Tunic - Notes and Thoughts</title>
          <pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/tunic-notes-and-thoughts/</link>
          <guid>https://fnlog.dev/gamer/tunic-notes-and-thoughts/</guid>
          <description>&lt;h2 id=&quot;tunic&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#tunic&quot; aria-label=&quot;Anchor link for: tunic&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Tunic&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Finished on Xbox with the pacifist ending&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Tunic_(video_game)&quot;&gt;Tunic&lt;&#x2F;a&gt; is a very deceptive game where its art style and aesthetics
indicate a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The_Legend_of_Zelda&quot;&gt;Zelda&lt;&#x2F;a&gt; inspired game yet for the most part it is a basic
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Soulslike&quot;&gt;Souls-like&lt;&#x2F;a&gt; with stamina, roll, death and other genre mechanics. What
makes this game special is its bold commitment to hide or obscure
information such as its mechanics, tutorial, story and in particular the
in-game manual which appeals to nostalgia when game cartridges used to
come with a manual but a foreign language. In a way, understanding and
beating the game with the bits and pieces becomes its own meta-game. To
summarize my thoughts and feelings though, I can break down the game by
its two end goals.&lt;&#x2F;p&gt;
&lt;p&gt;If the player&#x27;s goal is to free the &lt;em&gt;princess&lt;&#x2F;em&gt; and beat the last boss,
the game is an action game. As a &lt;em&gt;Souls-like&lt;&#x2F;em&gt; though, it is rather
simple and basic without much depth even with the talismans and items.
Talking about the combat mechanics, I find it strange that the player
receives more damage when their stamina is low or critical. The only
thing that consumes stamina is rolling and guarding to prevent
overreliance, but the stamina resource becomes a non-issue with enough
stat upgrades. Once the dodge is upgraded, blocking becomes less viable
or appealing, making dodge the only consumer since it is much faster and
safer. I think items and attacks should also require stamina, but the
game would be significantly slower than it has to just to make stamina
meaningful. So removing stamina altogether, adding a slight cooldown to
dodge and perhaps a seperate guard resource would be a better
experience.&lt;&#x2F;p&gt;
&lt;p&gt;Next, the parry mechanic feels awkward with a delayed timing since the
animation is so long with a long startup, short active window and a long
recovery. It vastly differs from the quick reaction-based parry or
deflection; however, this style of parry requires time or
experimentation to determine the actual delayed parry timing. The reward
for parrying is an enemy stagger, but this can be outright slower and
riskier while the magic items can be more efficient and faster specially
the grab or fireball magic item. Another issue is that some enemies
attacks are faster than the startup that must be parried before any
attack animation like the tall spear enemy&#x27;s thrust which feel awkward.
I think just removing the startup but keeping the long recovery would be
okay.&lt;&#x2F;p&gt;
&lt;p&gt;The consumable items are also not viable enough or encourage use because
of its issues. The first is being they are too expensive relative to
enemy drops where it may be more efficient to save for stat upgrades
instead. As chest rewards, they are underwhelming or their quantities
should be increased. I wish they are also rechargable or common drops
from enemies with a limited capacity to encourage use. Another issue is
that the enemies and overall combat difficulty and enemy variety do not
necessitate use. The one good thing I can say is the extra bonus items
when an item is repeatedly use which is a kind of item level or
progression, but again the prior issues make it only a minor
consolation.&lt;&#x2F;p&gt;
&lt;p&gt;Lastly, the special items and talismans do not change the gameplay that
much aside from handling enemies better. If items provide debuffs and
magic is restored via attacking, they could offer more utility, depth
and be better balanced. One imbalanced item is the pull magic item with
its low cost since and stuns enemies momentarily for at least a two hit
combo and then pulling again to stack the damage and combine that with
the magic flask talisman for more uses to easily handle enemies and some
bosses. One talisman idea is that ranged items do not consume magic but
stamina or allow magic to be refillable through attacks which can make
ranged combat more viable in general. Also consider item specific
talisman modifiers can be intriguing such as giving the sword a
projectile wave, the stick a magic transformation effect, the flame wand
a bigger fireball and effect but slower, less stamina on guard while
reflecting melee damage and so much more to make gameplay more spicy.&lt;&#x2F;p&gt;
&lt;p&gt;The biggest tell for me is that the combat is not that polished is the
combat gauntlet by the midgame. The gauntlet is fighting six enemy waves
of enemies in the order the player chooses with only the default stats
while redoing the whole if the player dies in between. Items are still
accessible although not viable with the low stamina and magic resource,
but the defensive talisman is quite valuable here for the survivability.
The only difficult part of this gauntlet is the fighting two of the
first boss then patience in kiting the remaining waves which feels more
attrition than skill. Completing the gauntlet upgraded the dodge to be
faster but afterwards the combat peaks in enemy difficulty or mechanics
making it seem my investment was meaningless. In a way, this peak also
indicates a transition to another genre.&lt;&#x2F;p&gt;
&lt;p&gt;After hours in the game, information can be found about an alternative
possible pacifist ending (&lt;a href=&quot;https:&#x2F;&#x2F;tunic.wiki&#x2F;uploads&#x2F;images&#x2F;gallery&#x2F;2022-03&#x2F;image-1647768312686.jpg&quot;&gt;manual page 46&lt;&#x2F;a&gt;) where the game becomes a
puzzle game instead. Without spoiling exact details, the player must
collect a certain collectible by &lt;strong&gt;&lt;strong&gt;praying&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; (&lt;a href=&quot;https:&#x2F;&#x2F;tunic.wiki&#x2F;books&#x2F;instruction-booklet-translation&#x2F;page&#x2F;page-44&quot;&gt;manual page 44&lt;&#x2F;a&gt;) through a
button sequence where each one has their own &lt;strong&gt;&lt;strong&gt;prayer&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;. Acquiring all
of it, unlocks information about the game&#x27;s language that allows the
final puzzle to be deciphered and solved which gives the pacifist
ending. Acquring this ending instead soured my enjoyment of the game.&lt;&#x2F;p&gt;
&lt;p&gt;Before talking about the collectible, one of the things that make this
game unique is its game manual where it emulates the feel of a booklet
by flipping throught its pages. The manual is the player&#x27;s main source
of information for the lore, mechanics and map, but it is obscured by an
in-game language. Despite that, most of the details can be inferred
through the images and some English words in the manual. The other catch
is that the manual is incomplete and pages of it can be found in-game.
While mostly not hard to find, each page can help find some of those
collectible and most importantly how to solve them.&lt;&#x2F;p&gt;
&lt;p&gt;Despite being called secrets, I will be calling them puzzles since they
are all required specially and judging them by how they are found and
solved. While it can be a joy, they have major issues in both aspects.
Regarding how they are found, it is important to discuss some problems
with the camera. Unlike a top-down camera, isometric cameras need to be
designed not to obscure paths from foreground elements such as walls or
tall objects and also reveal some area when traveling through them as to
not move blindly. However, this game hides so many paths or entrances by
this principle like its many shortcuts and not clearly hinting
traversible paths that requires tedious checking of edges. While this
might be clever, it becomes a significant annoyance when finding the
collectibles. The worst example is a collectible hidden behind the only
bomb breakable wall that is also obscured by a foreground element which
just feel cheap. If these paths were signposted, the discovery of these
collectibles would feel more active than accidental.&lt;&#x2F;p&gt;
&lt;p&gt;The greater issue in finding them is how hidden they are in plain sight.
I do not mind reexploring old areas with new abilities, but the
backtracking feels aimless without clear indicators or point of interest
which leads to constant backtracking. Some are the numerical sequences
and ground lines since they feel so randomly placed and harder to do
with the camera. Some are noticing something doing something for a
period of time which feels more of a waste of time. In general, when I
learned something was a puzzle, I was more annoyed that it was trying to
be clever.&lt;&#x2F;p&gt;
&lt;p&gt;On solving them, the overall puzzle design here is more monotonous and
boring. Some are blocked by foreground elements, some are recording or
tracing a pattern, some are just noticing its there. Overall, I felt the
game tried to stretch one gimmick mechanic too much. &lt;strong&gt;&lt;strong&gt;Praying&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; is
incrediblly error prone and unclear without a feedback system. Specially
the final puzzle or some secrets, the inputs can be so long that any
input errors cannot be detected and the player must restart the inputs
which can be draining. I understand the inspiration, but it made the
puzzle experience worse being the only method. Perhaps adding more
puzzle mechanics like incorporating items and maybe requiring only half
to decipher the manual can help with the monotony and pacing.&lt;&#x2F;p&gt;
&lt;p&gt;Not to say the game has no good puzzles, I did appreciate the one
reflected in the water since it required thinking about orientation. The
final one is quite nice although it was somewhat tedious with the manual
interface and missing &lt;strong&gt;&lt;strong&gt;data&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;. The debatable one is scattered across
the game that requires taking a screenshot and combining it possibly
with an external image editor which can be a barrier. At least the worst
ones are optional secrets such a music puzzle or standing in a specific
area for a minute if you can call that a puzzle.&lt;&#x2F;p&gt;
&lt;p&gt;Neither is this game a good action or puzzle game but the effort and
intent to replicate the nostalgia is respectable although flawed.
Looking back, the obfuscation of its information and mechanic feel more
gimmicky now and the effort to decipher the language may not be worth
the effort. Although I realize that some people enjoy and even thrive on
this level of obscurity, I wish the game clued me in earlier instead
near the endgame for me to understand this game was not for me.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>River City Girls - Notes and Thoughts</title>
          <pubDate>Mon, 07 Mar 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/river-city-girls-xbox-notes-and-thoughts/</link>
          <guid>https://fnlog.dev/gamer/river-city-girls-xbox-notes-and-thoughts/</guid>
          <description>&lt;h2 id=&quot;river-city-girls&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#river-city-girls&quot; aria-label=&quot;Anchor link for: river-city-girls&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
River City Girls&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Played on XBox with Misako on Hard difficulty&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;River_City_Girls&quot;&gt;River City Girls&lt;&#x2F;a&gt; is a modern pixel art &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Beat_%27em_up&quot;&gt;2D side-scrolling beat&#x27;em up&lt;&#x2F;a&gt;
where two high-school girls rescue their boyfriends. I personally do not
care about the history of the game being a spin-off in the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Kunio-kun&quot;&gt;Kunio-kun&lt;&#x2F;a&gt;
franchise, but how it good it is as a fighting game. My point of
reference is &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Streets_of_Rage_4&quot;&gt;Streets of Rage 4&lt;&#x2F;a&gt;, so I find this game sadly feels inferior
with several issues specially the story and combat.&lt;&#x2F;p&gt;
&lt;p&gt;While the story is serviceable for an action game, it is not satisfying
enough where a series of false leads culminate into a joke ending.
Although it is an excuse to visit areas and fight bosses, the quest and
dialogue is not clever or insightful enough to make it worthwhile and
overall detrimental to its world  whereas a simpler story might be better
like trying to fight through a sale or rare item. I am not sure how
impactful the references and callbacks are to the fans, but I felt every
character was missing some key character details or relationships which
made me confused as a newcomer. Despite not minding the story that much,
it is still rather bad.&lt;&#x2F;p&gt;
&lt;p&gt;Before talking about the core combat, I did not like the inclusion of a
level progression with stats and unlockable moves primarily because the
starting expereince feels so limited and restrictive which does not
allow or encourage for creative combos or expression. Addressing the
stats first, it is not explained nor does it feel impactful. In fact,
the strangest unexplained stat mechanic is that eating food increases
stats but what stat will be increased is unknown until purchased. While
I believe it is to incentivize visiting shops and purchasing items, I
feel it is not valuable enough with money being hard to acquire and
healing items commonly restoring a small amount given their cost. Also,
equippable items even from the bosses commonly only offer stat bonuses
that only give minor bonuses instead of gameplay depth or variety. My
suggestion is to remove the stat system altogether or rebalance and
rework its effects to make it more meaningful.&lt;&#x2F;p&gt;
&lt;p&gt;While unlocking moves primarily through money or a currency is a solid
idea, it is hard here because they are expensive without extensive
grinding and most importantly around 25% is lost on death which
frequently happens without good crowd control moves. In particualr,
fighting enemies to gain money for moves is not viable as the health
loss cannot be offset by the healing items. Rather, defeating bosses is
the main method of gaining money that must be immediately spent for
expensive moves before dying. This death mechanic punishes hoarding that
contradicts saving money for better moves to prevent death which is
paradoxical. If moves are unlocked through levels or some combined skill
point system like completing side quests, the inclusion of level
progression would make more sense. Although I do not believe this is a
good consequence for dying, this could have overall worked if healing
and money were more viable since dying is occasionally cheaper than
healing.&lt;&#x2F;p&gt;
&lt;p&gt;Regardless how moves can be unlocked, the worst issue is that the game&#x27;s
difficulty and approach does not push the player to its advanced
techniques such as juggling or launchers which is typically where the
fun is. The fundamental issue is a lack of tutorials, a training room
and the ability to test a move makes it harder to learn the combat
safely and creatively experiment specially with lost money on death.
Also, the game does not incentivize good performances like a hit or
damage multiplier where even small money bonuses could be attractive
enough. After beating the game, it does not offer reasons to replay the
game such as a ranking or new challenges despite offering two new
characters. I do believe the game has depth, but the game is not
designed to take advantage of that depth nor does it demand the player
to be good which is a shame for a fighting game.&lt;&#x2F;p&gt;
&lt;p&gt;Moving on the actual combat, it has many minor issues making the game
overall feel frustrating than it should be. First off, the environmental
background feels unpolished or untested as the foreground elements
obscure characters specially enemies that can lead to cheap hits where
adding opacity would easily work. Picking up a weapon, enemy or
attacking is tied to one contextual button that causes undesired inputs
and confusion where different buttons would fix this. Enemies have too
good vertical tracking attacks as well that makes those deceptive
despite being able to dodge vertically or block. Since special attacks
do not have invulnerability frames, enemy attacks occasionally interrupt
special moves that makes them less safe despite being crowd control
moves. In fact, players can be juggled or hit by multiple enemy leading
to unfair damage where some knockdown invulnerability would help. On the
other side since characters do not have moves to hit enemies on the
ground, players have to needlessly wait for them to get up that
contributes to making combat less engaging. Although players can ground
stomp and grab enemies of the ground, it is not the same as creating a
combo flow by relaunching them in the air. Overall, these many issues
make the core combat feel occasionally unpolished and unfair.&lt;&#x2F;p&gt;
&lt;p&gt;I do have other issues such as the music, art style and boss design, but
these said issues prevented me from fully enjoying and investing more
time. Still as a casual cooperative game, this is an okay product but
not for me.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Stickless Half Circle Inputs</title>
          <pubDate>Sat, 26 Feb 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/stickless-half-circle-inputs/</link>
          <guid>https://fnlog.dev/gamer/stickless-half-circle-inputs/</guid>
          <description>&lt;h2 id=&quot;half-circle-inputs&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#half-circle-inputs&quot; aria-label=&quot;Anchor link for: half-circle-inputs&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Half Circle Inputs&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Tested on &lt;strong&gt;&lt;strong&gt;KOF XV (Xbox)&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; with a &lt;strong&gt;&lt;strong&gt;Snackbox Micro&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I wanted to get into fighting games, but I was deterred because of the
motion inputs required. Primarily, rotating a stick, gamepad or
joystick, does not feel clear or exact because it is a digital input.
More importantly, performing those inputs fast and precisely are more
tiring and injury-prone without proper practice and posture. Thankfully,
stickless controllers were made like the &lt;a href=&quot;https:&#x2F;&#x2F;junkfoodarcades.com&#x2F;collections&#x2F;snack-box-micro&quot;&gt;Snackbox Micro&lt;&#x2F;a&gt; that replaces
the stick with four directional buttons (left, down, right then up)
which is better laid out for fighting games than the standard
directional pad. This new approach satisfies my conditions as doing
&lt;a href=&quot;https:&#x2F;&#x2F;fightinggameglossary.net&#x2F;index&#x2F;limb-notation&quot;&gt;quarter circle&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;fightinggameglossary.net&#x2F;index&#x2F;dp&quot;&gt;dragon punch&lt;&#x2F;a&gt; inputs feels more comfortable, precise
and tactile with button sequences. Playing &lt;a href=&quot;https:&#x2F;&#x2F;www.snk-corp.co.jp&#x2F;us&#x2F;games&#x2F;kof-xv&#x2F;&quot;&gt;KoF XV&lt;&#x2F;a&gt;, single grounded half
circles were no issue; however, doing double half circle inputs while in
the air became an issue like with &lt;a href=&quot;https:&#x2F;&#x2F;www.dreamcancel.com&#x2F;wiki&#x2F;index.php&#x2F;The_King_of_Fighters_XV&#x2F;Athena_Asamiya&quot;&gt;Athena&#x27;s Shining Crystal Bit&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;img src=&quot;snackbox-micro-layout.png&quot; &gt;
&lt;blockquote&gt;
&lt;p&gt;A Stickless Controller Layout&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Executing a half circle with a stickless controller can be intuitively
divided into two quarter circles. Using the notation (L)eft, (D)own and
(R)ight to represent the three main directional buttons of a stickless
controller, a forward quarter circle input can be done by pressing D,
then pressing R while holding D and finally lifting D while keeping R
pressed or more simply D, D+R, R. This motion can be described as
rolling two fingers, so doing a half circle can be though of as rolling
three fingers or L, L+D, D, D+R, R.&lt;&#x2F;p&gt;
&lt;img src=&quot;initial-method.gif&quot; &gt;
&lt;blockquote&gt;
&lt;p&gt;Doing a half circle input by rolling the fingers&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;The issue here is that the third input, D, is occassionaly dropped if
done too fast as controllers as inputs are read by &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Frame_rate&quot;&gt;frame&lt;&#x2F;a&gt;. To be precise
after the L+D input, if L is lifted while R is pressed at the same time
or within the space of one frame, the game reads D+R instead of D since
L needs to be lifted for at least one frame for D to be read. It is a
strange issue where being faster causes more issues.&lt;&#x2F;p&gt;
&lt;img src=&quot;down-dropped.gif&quot; &gt;
&lt;blockquote&gt;
&lt;p&gt;The Down input can be occassionally dropped when done too fast&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;After some experimentation, instead of rolling the fingers, pressing all
the fingers first and then lifting in the same order is more consistent
or L, L+D, L+D+R, D+R, R where the input L+D+R resolves to D because of
&lt;a href=&quot;https:&#x2F;&#x2F;www.hitboxarcade.com&#x2F;blogs&#x2F;support&#x2F;what-is-socd&quot;&gt;neutral SOCD cleaning&lt;&#x2F;a&gt; (L+R = neutral).&lt;&#x2F;p&gt;
&lt;img src=&quot;new-method.gif&quot; &gt;
&lt;blockquote&gt;
&lt;p&gt;Press the fingers then lifting in the same order&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Thanks also to &lt;a href=&quot;https:&#x2F;&#x2F;www.eventhubs.com&#x2F;guides&#x2F;2010&#x2F;jan&#x2F;11&#x2F;understanding-input-leniency-street-fighter-4&#x2F;&quot;&gt;half circle input leniency&lt;&#x2F;a&gt; where L+D and D+R is optional,
it does not matter if L or D is lifted first or at the same time because
the optional D+R is read if L is released first, neutral if D from SOCD
cleaning, and the required R if both that makes this method safer to
execute.&lt;&#x2F;p&gt;
&lt;img src=&quot;new-method-expected.png&quot; &gt;
&lt;img src=&quot;new-method-neutral.png&quot; &gt;
&lt;img src=&quot;new-method-both.png&quot; &gt;
&lt;blockquote&gt;
&lt;p&gt;It does not matter what order the fingers are lifted&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;One caveat is that this does not work with vertical half circles if
vertical SOCD is not neutral which up wins if both up and down are
pressed with my controller. Another caveat is that this method might
apply more pressure or stress on the last finger since it becomes the
anchor to lift the other fingers where practicing minimal effort is also
needed. For stickless controllers, I am aware of &lt;a href=&quot;https:&#x2F;&#x2F;www.hitboxarcade.com&#x2F;blogs&#x2F;hit-box&#x2F;street-fighter-v-shortcut-guide&quot;&gt;other half circle
shortcuts&lt;&#x2F;a&gt; (L, D, R) but I do find these lift-press or tap motions
introduces a timing bottleneck and feels less consistent to execute
fast. Nonetheless, I hope this new method helps.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Fatal Frame 5 Remastered - Quick Thoughts</title>
          <pubDate>Wed, 03 Nov 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/fatal-frame-5-remastered-quick-thoughts/</link>
          <guid>https://fnlog.dev/gamer/fatal-frame-5-remastered-quick-thoughts/</guid>
          <description>&lt;h2 id=&quot;fatal-frame-5&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#fatal-frame-5&quot; aria-label=&quot;Anchor link for: fatal-frame-5&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Fatal Frame 5&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.koeitecmoamerica.com&#x2F;fatalframe&#x2F;mobw&#x2F;&quot;&gt;Fatal Frame: Maiden of the Black Water Remastered&lt;&#x2F;a&gt; or &lt;em&gt;Fatal Frame 5&lt;&#x2F;em&gt;
is a Japanese ghost survival horror game where three characters are
looking for a missing person in a haunted mountain shrine over several
nights. As it follows series tradition of an exorcising camera and
catastrophic ritual, what makes this unique is its primary theme of
suicide; however, this new entry fails to establish strong writing,
characters and performances to fully explore or utilize this theme.
Moreover, this game is much more streamlined that it loses its
challenge, design and tension. It is an okay game but a failure as a
new entry.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quick-thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#quick-thoughts&quot; aria-label=&quot;Anchor link for: quick-thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Quick Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;This game is similar to the third game where it has three playable
characters with their own shooting styles investigating a flooded
mountain over multiple nights and chapters ideally crossing over each
other&#x27;s path and culminating into a satisfying ending. Like the forth
game, it also utilizes the motion controls which makes camera control
a bit faster and drops the fixed camera perspective for a modern third
person camera which is not necessarily good for this genre. What makes
the games in this series special is that the horror, tone and
atmosphere are solidly executed; here however, the game shows a lack
of polish in character, map and quest design and too many player
options bring the horror down.&lt;&#x2F;p&gt;
&lt;p&gt;My biggest issue with the game is the significant backtracking or
retreading where the player returns and navigates to the same areas
too much without variation or contextualization. Since the game is
structured into multiple chapters over several nights, the story and
pacing suffers to give the characters frustrating reasons to come back
specially worse for fillers such as the lore and home surveillance
chapters. The characters also suffer as the game demands them to be
frustratingly less intelligent to piece together information and more
importantly the consequences of their actions. Beside the story and
characters, retreading the same areas repeatedly become monotonous,
breaks immersion and shows a lack of careful map and quest design. In
comparison with the third game&#x27;s large central location, the player
must investigate any new facts then appear within it at an
unpredictable location which feels more natural and better paced.&lt;&#x2F;p&gt;
&lt;p&gt;Another big issue is the third person camera and analog movement is so
bad that a fixed camera perspective and tank controls would work
better. First the camera field of view is so close that it hard to see
what is in front and induces nausea where a simple accessibility
option would really help. While the camera is typical of most games,
the movement system is relative to the camera which causes so much
unwanted turns which becomes so inconsistent at times if not moving
towards the camera&#x27;s direction specially when picking up items or in
combat. While a bit more subjective, the camera combat favors multiple
targets that feels more like a fast arcade shooter than slow and
deliberate which requires patience and enhances the atmosphere. In
general, movement was not an issue in the old games yet here the
immersion is occasionally ruined.&lt;&#x2F;p&gt;
&lt;p&gt;Another massive issue is the lack of challenge or excessive hand
holding. Puzzles which gave variety and tone are gone or nonexistent.
Items can now be bought before starting a chapter that greatly
diminishes resource management which provides mechanical tension or
item conservation. Because of its arcade chapter structure, chapters
must be designed to be finished independently removing the pressure
for resource management and the need for better quest design. The fact
that players can ask for help where to go anytime with ghost traces
seems to cover up the poor map design as well. Another example of that
is when acquiring keys, the game shows on the map where to use it
which just shows a lack of faith in the player. Too many healing items
are also given to the player each chapter making even the combat less
tense. Regarding camera combat, the auto-tracking is too good since
getting counterattacks becomes easier. Lastly, the enemy indicators
when raising the camera just cover up the uninspired fight areas. With
so many concessions for the player, it feels the game favored making
it more accessible than retaining its memorable aspects.&lt;&#x2F;p&gt;
&lt;p&gt;I usually play Japanese games in Japanese audio for the intended
experience; however, the remastered version only has English audio
that accentuates poorer dialogue not in their intended language which
is the case here. In general, the character&#x27;s performances feel
stilted that tilts more to B grade horror. For example, characters
barely react to key information when read or the constant repetition
of known facts makes them feel stupid or slow. Characterization is
also sparse and poor that barely exploring relationships or giving
them colorful insights. Not to forget the sexualized female designs,
alternative costumes, wetness mechanic and all the crouching positions
pushes them as objects than characters even more. Although the old
games may have that same quality, this is feels more like a lack of
polish even if its is a modern remaster.&lt;&#x2F;p&gt;
&lt;p&gt;The story is not noteworthy enough to discuss and does not have a
strong resolution specially with all the padding. Also, one of the
three protagonist feels like sketchy fan service and does not
contribute much to the overarching mystery which could be removed and
provide a more paced story. The theme of suicide does not land well
since the characters are flat and relationships underdeveloped
specially the assistant of the male protagonist who just keeps getting
into trouble. Even if the old game&#x27;s protagonists were as quiet and
lacked character, it did not hold back the story and atmosphere.&lt;&#x2F;p&gt;
&lt;p&gt;Overall, this game looks like a game of its series but lacks the bite
and charm of its predecessors. This game has so many issues I wonder
why any of first three was not remastered since it had a solid design
and experience. If another game comes out of this series, I hope this
will not be an example or the direction it follows, although with the
fourth game is not giving me much hope.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>No More Heroes 3 - Quick Thoughts</title>
          <pubDate>Mon, 25 Oct 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/no-more-heroes-3-quick-thoughts/</link>
          <guid>https://fnlog.dev/gamer/no-more-heroes-3-quick-thoughts/</guid>
          <description>&lt;h2 id=&quot;no-more-heroes-3&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#no-more-heroes-3&quot; aria-label=&quot;Anchor link for: no-more-heroes-3&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
No More Heroes 3&lt;&#x2F;h2&gt;
&lt;p&gt;Like its prior games, &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;No%5FMore%5FHeroes%5FIII&quot;&gt;No More Heroes 3&lt;&#x2F;a&gt; is the story of a top-ranked
assassin saving Earth from an invading alien gang through an
interplanetary assassin ranking competition. The joy of the game and
the whole series is its unpredictable yet grounded characters while
the combat system is competent enough to support it. Although this
game has a bigger scope and several improvements, it feels messy and
less meaningful to play. This is still personally a good game with
interesting boss fights and clever twists, but its negative aspects
severely pull it down from being a recommendable game for non-fans.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quick-thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#quick-thoughts&quot; aria-label=&quot;Anchor link for: quick-thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Quick Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;Let me begin with the things I like which is mostly a return to the
style of the first game. First of is the combat system which is more
fluid and now has potentially modifiable skills via death chips. To
keep up with those changes, the enemies and bosses are more varied and
challenging. The new mini-games are quirky and enjoyable specially the
robot shooter battles. Lastly, the story of the alien leader as he
loses his friends and control is a good narrative choice. Overall, the
game still has its charm and style which I appreciate; however, its
issues severely impact those good qualities that make the game a chore
to play.&lt;&#x2F;p&gt;
&lt;p&gt;Since this game follows its ranking format of fighting ten ranked, the
worst issue is the required entry fights for each rank. Early on, they
are challenging and introduce new enemies which make each rank fight a
real accomplishment; however in the late game, they stop being
distinct and merely repeating formations with stronger variants which
becomes drawn-out fights. This is compounded with every fight not
offering any details such as enemy composition and its unpredictable
or random placement in the map makes it hard to know whether a fight
is difficult or worth taking. As a completionist I took every fight,
and they are really tiring and tedious overtime which feels more
padding than player choice. Perhaps the game had fewer entry fights
and possibly spaced the enemy varieties closer to the end, the flow
and difficulty will feel faster and better.&lt;&#x2F;p&gt;
&lt;p&gt;While the combat system feels better to play than the first, the issue
is its progression that is a straightforward point system. The first
half of the issue is acquiring those skill points which is acquired
through fights. The problem is that it can be easily broken by redoing
boss fights at an easier difficulty and skill points are rewarded
based on performance rather than difficulty. This is a non-issue in
the first game as skill or stat progression was gated off by
mini-games or exploration and would feel much more rewarding and
interesting.&lt;&#x2F;p&gt;
&lt;p&gt;The other half is the combat balance and customization via gauntlet
chips. The biggest issue here is once the player acquires the rapid
thrust skill, enemies and even bosses can be trivially controlled and
becomes a fast and safe method which becomes boring over time. Without
other viable combat skills, the many entry fights feel longer and more
procedural than fluid or expressive. This also applies to the limited
gauntlet skills that is ironic as creating chips could have imbued
different skills rather than simply percentage attribute bonuses.
Attribute percentage bonuses is the least interesting way to provide
progression and balance, so just providing more varied skills can give
the depth and creativity the combat deserves.&lt;&#x2F;p&gt;
&lt;p&gt;The reintroduction of an open world is much appreciated, but the
implementation feels hollow or empty. While the space is larger,
navigating through it specially with the bike is often janky with
unclear collisions or terrain causing motorcycle crashes making it
feel unpolished. The new islands&#x2F;regions are mostly wide empty spaces
as if to hide the entry fights which feels uninteresting alongside the
mini-map making it trivial to find. What is worse is that since the
player is teleported to a different fight area, the space itself is
less relevant to its purpose or meaning. Comparing with the first
game, it does this so much better and simpler. Even if this game&#x27;s
world might serve an aesthetic or tonal function, it is severely
underutilized and perhaps better more restrictive for its purpose.&lt;&#x2F;p&gt;
&lt;p&gt;Lastly, the story or continuity itself is confusing even for fans.
While a game for fans is nice and a certain level of logical disbelief
is needed, the tone feels less grounded and worth taking seriously. I
do like the abstract aliens and design, the introductory television
segments, game references and various boss gimmicks; however, time
travel, resurrections, cameos, giant robots in the story begin to lose
me. In particular, the alien leader does not change or inspire change
by his presence except for his childhood friend. This is a waste as
his eventual defeat does not inspire reflection or meaning. This is
all subjective, but the prior games were able to tackle different
themes much better and made me appreciate the game even if it was not
perfect. If another sequel exists, I hope it has a better intriguing
story.&lt;&#x2F;p&gt;
&lt;p&gt;Regardless of other minor issues, the game is still brimming with
style and a good entry in the series. It is unavoidable to compare
this with the prior games specially the first one as it still holds up
today. After playing several games of the studio&#x2F;director, padding and
pacing seems to be an persistent issue I hope that will be addressed
for future games.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Outer Wilds: Echoes of the Eye - Quick Thoughts</title>
          <pubDate>Sun, 17 Oct 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/outer-wilds-echoes-of-the-eye-quick-thoughts/</link>
          <guid>https://fnlog.dev/gamer/outer-wilds-echoes-of-the-eye-quick-thoughts/</guid>
          <description>&lt;h2 id=&quot;outer-wilds-echoes-of-the-eye&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#outer-wilds-echoes-of-the-eye&quot; aria-label=&quot;Anchor link for: outer-wilds-echoes-of-the-eye&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Outer Wilds: Echoes of the Eye&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.mobiusdigitalgames.com&#x2F;blog&#x2F;echoes-of-the-eye-is-here&quot;&gt;Outer Wilds: Echoes of the Eye PS4&lt;&#x2F;a&gt; is an additional story content or &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Downloadable%5Fcontent&quot;&gt;DLC&lt;&#x2F;a&gt;
that introduces a new hidden planet or region which focuses more on
creative thinking and mechanical exploration. Aside from the &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.fandom.com&#x2F;wiki&#x2F;Anglerfish&quot;&gt;Anglerfish&lt;&#x2F;a&gt;,
this also introduces a direct horror element of pursuing enemies in
darkness which adds more distress and fear aside from the innate time
pressure. Above all, this expansion provides a very difficult puzzle
mystery with new mechanics and ideas to ponder which gives a challenge
rivaling or surpassing the original. The DLC is definitely worth the
challenge and a good reason to revisit this stellar game.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes-and-thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes-and-thoughts&quot; aria-label=&quot;Anchor link for: notes-and-thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes and Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;WARNING: Early game spoilers ahead&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Finding the new region is quite a surprise as stealth technology has
never been introduced before. The new region is visually interesting as
it rotates on a wheel and the opposite side can be seen anytime almost
the inverse of &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.fandom.com&#x2F;wiki&#x2F;Brittle%5FHollow&quot;&gt;Brittle Hollow&lt;&#x2F;a&gt;. Riding the river with a raft is also nice
as a new means of travel and how &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Centrifugal%5Fforce&quot;&gt;centrifugal force&lt;&#x2F;a&gt; maintains the
current. As this is also a new race, I appreciate that the translator
does not work and the way to communicate is with images through the
slides. The new inhabitants are an intriguing combination of owl and
deer, but it would be nice if they could fly as well. Overall familiar
with the earthy swamp aesthetic and nocturnal animals but something
hidden beneath that exterior.&lt;&#x2F;p&gt;
&lt;p&gt;The overall goal in this new region is to unlock the vault. Since the
challenge is higher, exploring areas thoroughly specially for the slide
reels and reviewing the facts is more important here as the region is
small. Solutions are designed cleverly and fair as discovering them
offers the same thrill and joy. Sadly, the ending of the new region may
seem abrupt or anti-climactic considering the effort which is similar to
the &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.fandom.com&#x2F;wiki&#x2F;Quantum%5FMoon&quot;&gt;Quantum Moon&lt;&#x2F;a&gt; optional quest. Aside from seeing the ending again, the
true reward is a variation on the ending, and it is definitely worth
redoing.&lt;&#x2F;p&gt;
&lt;p&gt;My major personal gripe with this new region is the global darkness that
makes it hard on the eyes; however, it works in this game as light plays
a central theme and role for this new region. The darkness also
heightens the environment from the familiar to the treacherous as the
pursuers hunt. How they reach out from the darkness to extinguish the
player&#x27;s light will stay with me. I feel the darkness is an integral
part of the experience, but an accessibility option would be nice.&lt;&#x2F;p&gt;
&lt;p&gt;As solving the mystery requires more backtracking and setup, some
players might feel this is more tedious like the rafts which is
understandable. As a DLC, being more complex and challenging is its goal
although at the cost of some tedium. What it brings to the game is still
worth exploring and tackling.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;WARNING: End game spoilers ahead&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Understanding the history and motivation of the &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.fandom.com&#x2F;wiki&#x2F;The%5FStranger%27s%5Finhabitants&quot;&gt;precursor race&lt;&#x2F;a&gt; is quite
sad. They had high hopes for the &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.fandom.com&#x2F;wiki&#x2F;Eye%5Fof%5Fthe%5FUniverse&quot;&gt;Eye&lt;&#x2F;a&gt; but felt resentment and shame on
what it will bring and what was sacrificed. To prevent others from
making the same mistake, they blocked the &lt;em&gt;Eye&lt;&#x2F;em&gt;&#x27;s signal and retreated
into their simulated home world until it dies. Rather than harming them,
I believe they failed to realize that the &lt;em&gt;Eye&lt;&#x2F;em&gt; was calling out to
everyone and that refusal might have prevented others from restarting
the galaxy. If not for the sacrifice and excessive imprisonment of &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.fandom.com&#x2F;wiki&#x2F;Prisoner&quot;&gt;one
of them&lt;&#x2F;a&gt;, the &lt;em&gt;Nomai&lt;&#x2F;em&gt; might have never come and the &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.fandom.com&#x2F;wiki&#x2F;Hearthian&quot;&gt;Hearthian&lt;&#x2F;a&gt; to finish
the story.&lt;&#x2F;p&gt;
&lt;p&gt;With the precursor race specializing in light and being primarily
observers, concealment or ignorance is a major motif in its story and
aesthetics:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The ship itself obscures light to hide its presence to keep their slumber undisturbed.&lt;&#x2F;li&gt;
&lt;li&gt;Much of the information acquired is through watching memories through
their numerous projectors and slide reels which may be redacted or
burned.&lt;&#x2F;li&gt;
&lt;li&gt;The number of hidden passages, false walls, invisible bridges and
locks is meant to hide things in plain sight.&lt;&#x2F;li&gt;
&lt;li&gt;Finding the glitches requires extinguishing the light and finding it
in the darkest area like the green fire.&lt;&#x2F;li&gt;
&lt;li&gt;The hidden world is a reflection of their vivid home world rather than
what they did to it.&lt;&#x2F;li&gt;
&lt;li&gt;Blocking the &lt;em&gt;Eye&lt;&#x2F;em&gt;&#x27;s signal in a way denies its existence similarly to
the &lt;em&gt;Prisoner&lt;&#x2F;em&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;The lantern&#x27;s themselves allow the player to focus or conceal their
light. To shine the way or to hide it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Simple Page View Tracking with Cloudflare KV</title>
          <pubDate>Wed, 13 Oct 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/simple-page-view-tracking-with-cloudflare-kv/</link>
          <guid>https://fnlog.dev/wanderer/simple-page-view-tracking-with-cloudflare-kv/</guid>
          <description>&lt;h2 id=&quot;page-view-tracking&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#page-view-tracking&quot; aria-label=&quot;Anchor link for: page-view-tracking&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Page View Tracking&lt;&#x2F;h2&gt;
&lt;p&gt;Since this blog is personal and small, I did not believe page view
tracking was needed nor was it worth the cost. While free alternatives
exist, I do not want extra privacy analytics such as IP address,
browser or region to be collected which may identify the user, so I
did not consider it until recently. With &lt;a href=&quot;https:&#x2F;&#x2F;www.cloudflare.com&#x2F;products&#x2F;workers-kv&#x2F;&quot;&gt;Cloudflare&#x27;s free KV storage
offering&lt;&#x2F;a&gt;, I could create a simple &lt;a href=&quot;https:&#x2F;&#x2F;workers.cloudflare.com&#x2F;&quot;&gt;worker&lt;&#x2F;a&gt; that increments a page view
counter by page title when viewed. This would require adding a site
script to invoke the worker; however, this can be circumvented by
script blockers which is fine since I only need a general view. In
terms of &lt;a href=&quot;https:&#x2F;&#x2F;www.cloudflare.com&#x2F;privacypolicy&#x2F;&quot;&gt;Cloudflare privacy policy&lt;&#x2F;a&gt;, the only caveat with this approach
is that the endpoints may still log IP for operational monitoring, so
using a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;VPN%5Fservice&quot;&gt;VPN service&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;www.torproject.org&#x2F;&quot;&gt;Tor&lt;&#x2F;a&gt; is highly encouraged. Privacy concerns
aside, free workers are only offered 1000 daily writes, therefore this
approach only works if the site traffic has less than 1000 daily
views. Nonetheless, this approach works for my use case and is
significantly better than maintaining and securing a database.&lt;&#x2F;p&gt;
&lt;p&gt;(Source code for worker and CLI tool can be found &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;page-tracker-worker&quot;&gt;here&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;page-tracker-cli&quot;&gt;here&lt;&#x2F;a&gt;
respectively.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cloudflare-worker&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflare-worker&quot; aria-label=&quot;Anchor link for: cloudflare-worker&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Cloudflare Worker&lt;&#x2F;h2&gt;
&lt;p&gt;After creating a &lt;a href=&quot;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;sign-up&quot;&gt;Cloudflare account&lt;&#x2F;a&gt;, playing around with the dashboard
and checking out the ecosystem, I decided to build and deploy the
worker using the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;wrangler&quot;&gt;wrangler CLI&lt;&#x2F;a&gt; with the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;rustwasm-worker-template&quot;&gt;Rust WASM template&lt;&#x2F;a&gt; specifically
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;workers-rs#durable-object-kv-secret--variable-bindings&quot;&gt;worker-rs KV example&lt;&#x2F;a&gt; makes it straightforward. Getting up and started
with is:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Install wrangler via cargo
&lt;&#x2F;span&gt;&lt;span&gt;$ cargo install wrangler
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Copy the template
&lt;&#x2F;span&gt;&lt;span&gt;$ wrangler generate page-tracker-worker https:&#x2F;&#x2F;github.com&#x2F;cloudflare&#x2F;rustwasm-worker-template
&lt;&#x2F;span&gt;&lt;span&gt;$ cd page-tracker-worker
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Fetch credentials via browser login
&lt;&#x2F;span&gt;&lt;span&gt;$ wrangler login
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Create the KV storage and store the last line config entry
&lt;&#x2F;span&gt;&lt;span&gt;$ KV_ENTRY=$(wrangler kv:namespace create PAGE_COUNTER --verbose | tail -n 1 )
&lt;&#x2F;span&gt;&lt;span&gt;{ binding = &amp;quot;PAGE_COUNTER&amp;quot;, id =&amp;quot;mykvid&amp;quot; }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Copy the value to wrangler.toml under the kv_namespaces document property
&lt;&#x2F;span&gt;&lt;span&gt;# Using sed to insert it into the empty 6th line easily
&lt;&#x2F;span&gt;&lt;span&gt;$ sed -i &amp;quot;6s&#x2F;^&#x2F;kv_namespaces = [ $KV_ENTRY ]&amp;quot; wrangler.toml
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# To check if the storage is created
&lt;&#x2F;span&gt;&lt;span&gt;$ wrangler kv:namespace list
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;wrangler.toml&lt;&#x2F;code&gt; should look like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# wrangler.toml
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;page-tracker-worker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;javascript&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;workers_dev &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;compatibility_date &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;2021-10-10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;compatibility_flags &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= [ &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;formdata_parser_supports_files&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; ]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;kv_namespaces &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= [ { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;binding &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PAGE_COUNTER&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;id &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mykvid&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; } ] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# NEW LINE HERE
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# ... rest of template omitted ...
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is all the configuration needed, the next step is to implement
the worker. The worker essentially takes an HTTP POST request, gets
the request path and increments the path&#x27;s counter. With some minor
CORS handling and cues from &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;worker&#x2F;0.0.6&#x2F;worker&#x2F;&quot;&gt;worker-rs docs&lt;&#x2F;a&gt;, the main worker code is
easily done:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; src&#x2F;main.rs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;lazy_static! &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; The site name for CORS
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static ref &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;SITE_URI&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;static str = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;fnlog.dev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Make sure this matches with the one in `wrangler.toml`
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static ref &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;KV_BINDING&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;static str = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PAGE_COUNTER&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Template main entry point
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;event&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;fetch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; respond_with_errors&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;req&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Request, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Better logging on error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;utils&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set_panic_hook&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; OPTIONS CORS handler
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;matches!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;req&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;method&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Method&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Options&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cors_headers &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        cors_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Access-Control-Allow-Origin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;SITE_URI&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        cors_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Access-Control-Allow-Methods&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;POST,OPTIONS&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        cors_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Access-Control-Max-Age&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;86400&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Allow required headers from the request
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        cors_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Access-Control-Allow-Headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;req&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Access-Control-Request-Headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap_or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cors_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; POST handler
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; This is POST to make sure it is accessed via network call
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;matches!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;req&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;method&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Method&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Post&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Get request path
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; path &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; req&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Initialize KV storage by name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; kv &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;kv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;KV_BINDING&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Get string counter of the path
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; counter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; kv
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;and_then&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;txt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;txt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap_or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Increment counter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_counter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;counter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Store new value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Minor gatcha is that .execute() is needed to commit the change
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        kv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new_counter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;execute&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Set CORS headers
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cors_headers &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        cors_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Access-Control-Allow-Origin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;SITE_URI&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Return success with the path
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cors_headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Fallthrough response
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Bad Request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;400&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Testing the worker locally:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Run the dev worker at 127.0.0.1:8787
&lt;&#x2F;span&gt;&lt;span&gt;$ wrangler dev
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Test the worker with curl
&lt;&#x2F;span&gt;&lt;span&gt;# Path: &#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;$ curl -XPOST http:&#x2F;&#x2F;127.0.0.1:8787&#x2F;   # Value: 1
&lt;&#x2F;span&gt;&lt;span&gt;$ curl -XPOST http:&#x2F;&#x2F;127.0.0.1:8787&#x2F;   # Value: 2
&lt;&#x2F;span&gt;&lt;span&gt;# Path: &#x2F;dev&#x2F;blog_name
&lt;&#x2F;span&gt;&lt;span&gt;$ curl -XPOST http:&#x2F;&#x2F;127.0.0.1:8787&#x2F;dev&#x2F;blog_name
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Check the KV keys
&lt;&#x2F;span&gt;&lt;span&gt;$ wrangler kv:key list --binding PAGE_COUNTER
&lt;&#x2F;span&gt;&lt;span&gt;[{&amp;quot;name&amp;quot;: &amp;quot;&#x2F;&amp;quot;},{&amp;quot;name&amp;quot;: &amp;quot;&#x2F;dev&#x2F;blog_name&amp;quot;}]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Fetch KV value by key
&lt;&#x2F;span&gt;&lt;span&gt;$ wrangler kv:key get &amp;#39;&#x2F;&amp;#39; --binding PAGE_COUNTER
&lt;&#x2F;span&gt;&lt;span&gt;2
&lt;&#x2F;span&gt;&lt;span&gt;$ wrangler kv:key get &amp;#39;&#x2F;dev&#x2F;blog_name&amp;#39; --binding PAGE_COUNTER
&lt;&#x2F;span&gt;&lt;span&gt;1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With it working locally, deploying it as simple as &lt;code&gt;wrangler publish&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Deploy worker to Cloudflare
&lt;&#x2F;span&gt;&lt;span&gt;$ wrangler publish
&lt;&#x2F;span&gt;&lt;span&gt; Successfully published your script to
&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;page-tracker-worker.fnlog-dev.workers.dev
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Test if it is deployed
&lt;&#x2F;span&gt;&lt;span&gt;$ curl -XPOST https:&#x2F;&#x2F;page-tracker-worker.fnlog-dev.workers.dev&#x2F;test&#x2F;path
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;test&#x2F;path
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The final step is to invoke this endpoint when a user views or loads a
page. As described in the beginning, it can look like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;js&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-js &quot;&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trackPage&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;success&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; URL of the worker
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;workerUri &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;page-tracker-worker.fnlog-dev.workers.dev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Get the path of the current URL
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pathname &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= new &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;URL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(window&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;location)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Append the path to the worker URI for the complete URL
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;workerUrl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;workerUri &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pathname
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Send the network request
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xhr &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;window&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;XMLHttpRequest &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;? new &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;XMLHttpRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;: new &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ActiveXObject&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Microsoft.XMLHTTP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;open(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;POST&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;workerUrl)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;onreadystatechange &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;readyState&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;status&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;200&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;) success(xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;responseText)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setRequestHeader(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;X-Requested-With&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;, &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;XMLHttpRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trackPage(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;){ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;* NOOP *&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If CORS is an issue, do review the worker response headers; otherwise,
the site now has &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Do%5Fit%5Fyourself&quot;&gt;DIY&lt;&#x2F;a&gt; analytics. Visit the details for the &lt;a href=&quot;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;?to=&#x2F;:account&#x2F;workers&#x2F;kv&#x2F;namespaces&quot;&gt;KV dashboard&lt;&#x2F;a&gt;
views after some time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;analytics&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#analytics&quot; aria-label=&quot;Anchor link for: analytics&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Analytics&lt;&#x2F;h2&gt;
&lt;p&gt;Although the analytics work, it is tedious to login and check the &lt;a href=&quot;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;?to=&#x2F;:account&#x2F;workers&#x2F;kv&#x2F;namespaces&quot;&gt;KV
dashboard&lt;&#x2F;a&gt; for the page views and with no means to export the data.
Using the &lt;a href=&quot;https:&#x2F;&#x2F;api.cloudflare.com&#x2F;&quot;&gt;Cloudflare API&lt;&#x2F;a&gt; as a workaround, a scheduled daily script
could fetch the entries and write it to a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Comma-separated%5Fvalues&quot;&gt;CSV&lt;&#x2F;a&gt; file. In particular, the
&lt;a href=&quot;https:&#x2F;&#x2F;api.cloudflare.com&#x2F;#workers-kv-namespace-list-a-namespace-s-keys&quot;&gt;list keys&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;api.cloudflare.com&#x2F;#workers-kv-namespace-read-key-value-pair&quot;&gt;read key value&lt;&#x2F;a&gt; endpoints is what is needed. After
getting my &lt;a href=&quot;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;profile&#x2F;api-tokens&quot;&gt;API Token&lt;&#x2F;a&gt;, it should be easy to write a CLI script for this
with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;TeXitoi&#x2F;structopt&quot;&gt;structopt&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;seanmonstar&#x2F;reqwest&quot;&gt;reqwest&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tokio-rs&#x2F;tokio&quot;&gt;tokio&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;To access the API, the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;JSON%5FWeb%5FToken&quot;&gt;API JWT&lt;&#x2F;a&gt;(&lt;code&gt;PT_JWT&lt;&#x2F;code&gt;), account ID(&lt;code&gt;PT_ACCOUNT_ID&lt;&#x2F;code&gt;)
and KV ID(&lt;code&gt;PT_KV_ID&lt;&#x2F;code&gt;) are needed that can be environment variables. To
get the account and KV ID, visit the KV dashboard details and the URL
should match this pattern:
&lt;code&gt;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;$PT_ACCOUNT_ID&#x2F;workers&#x2F;kv&#x2F;namespaces&#x2F;$PT_KV_ID&lt;&#x2F;code&gt;.
With &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;structopt&#x2F;0.3.23&#x2F;structopt&#x2F;#environment-variable-fallback&quot;&gt;structopt env args&lt;&#x2F;a&gt;, the CLI can be started like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; src&#x2F;main.rs
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;anyhow&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;PathBuf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;structopt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;StructOpt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; StructOpt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;structopt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;enum &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Opt &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Download subcommand
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Subcommands allow more commands to be added easily
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Download &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;structopt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;long&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; env &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT_JWT&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; hide_env_values &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        jwt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;structopt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;long&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; env &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT_ACCOUNT_ID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; hide_env_values &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        account_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;structopt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;long&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; env &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT_KV_ID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; hide_env_values &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        kv_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Optional arg to specify the download folder
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;structopt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;long&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; default_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        output_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; PathBuf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Setup async main with tokio and quick error handling with anyhow
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;tokio&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dyn &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Opt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Opt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Download &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; jwt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; account_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; kv_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; output_dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;todo!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With the credentials available, the API endpoints can be async
functions with some help from &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;serde-rs&#x2F;serde&quot;&gt;serde&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; src&#x2F;main.rs
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;reqwest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;percent_encoding&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;utf8_percent_encode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NON_ALPHANUMERIC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;serde&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Deserialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Define credential as 3-tuple string for type convenience
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Credential &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; List Keys sample output:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;   &amp;quot;result&amp;quot;: [{ &amp;quot;name&amp;quot;: &amp;quot;&#x2F;about&#x2F;&amp;quot; }],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;   &amp;quot;success&amp;quot;: true,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;   &amp;quot;errors&amp;quot;: [],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;   &amp;quot;messages&amp;quot;: [],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;   &amp;quot;result_info&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;     &amp;quot;count&amp;quot;: 1,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;     &amp;quot;cursor&amp;quot;: &amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;   }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Deserialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ListKeysPayload &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ListKey&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Deserialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ListKey &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; String,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Given a reqwest client and credentials, fetch all KV keys.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list_keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Client, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;cred&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Credential&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jwt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; account_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; kv_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cred&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; url &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;format!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;api.cloudflare.com&#x2F;client&#x2F;v4&#x2F;accounts&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;storage&#x2F;kv&#x2F;namespaces&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        account_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; kv_id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; JWT is an authorization bearer header
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; resp &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bearer_auth&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jwt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; payload &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; resp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ListKeysPayload&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; The only thing needed is the collected `.result[].name`
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;payload
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Given a reqwest client, credentials and KV key, fetch the key&amp;#39;s value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_key_value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Client, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;cred&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Credential, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jwt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; account_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; kv_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cred&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; url &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;format!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;api.cloudflare.com&#x2F;client&#x2F;v4&#x2F;accounts&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;storage&#x2F;kv&#x2F;namespaces&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;values&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        account_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        kv_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; The key has to be percent encoded
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        utf8_percent_encode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;NON_ALPHANUMERIC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; resp &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bearer_auth&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jwt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; No need for custom deserializer since the value is returned directly
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; resp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The main fetching code can be implemented using these functions and
some &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;futures-rs&quot;&gt;futures-rs combinators&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; src&#x2F;main.rs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; In the download command
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Opt::Download { jwt, account_id, kv_id, output_dir } =&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;futures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;future&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;FutureExt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;FuturesUnordered&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; StreamExt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Initialize client and credentials
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; client &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; credentials &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jwt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; account_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; kv_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Fetch all keys
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; keys &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list_keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;credentials&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; For each key, fetch its value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; To run them concurrently, `FuturesUnordered` is used
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; view_futures &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;FuturesUnordered&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; key &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; keys &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    view_futures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;({
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; client &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; credentials &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; credentials&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        async &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; view&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_key_value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;credentials&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; view&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Run all the futures and collect them into a list
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; view_futures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Sort the data by path to easily read the data.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sort_by_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The last step is to write this data to a CSV file that is made easy by
the &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;csv&#x2F;1.0.0&#x2F;csv&#x2F;cookbook&#x2F;index.html#writing-with-serde&quot;&gt;csv crate&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; src&#x2F;main.rs
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;csv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Writer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;chrono&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;DateTime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Utc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;serde&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Serialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Serialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CsvRecord &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; String,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;views&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Generate the output path using the current date and time
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Sample path: .&#x2F;my-output-dir&#x2F;2021-10-12T04:00:50Z.csv
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DateTime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Utc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Utc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; output_path &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; output_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%FT%TZ.csv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Open the path for writes
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; wtr &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Writer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output_path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Write each successful entry
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; view_res &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; views&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; view_res&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    wtr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;serialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;CsvRecord &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; views &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Finalize the CSV
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wtr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flush&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After all that code, the CLI can now be built and the data exported:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Export required env variables
&lt;&#x2F;span&gt;&lt;span&gt;$ export PV_JWT=&amp;quot;1234&amp;quot; PV_ACCOUNT_ID=&amp;quot;account_id&amp;quot; PV_KV_ID=&amp;quot;kv_id&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Build the CLI
&lt;&#x2F;span&gt;&lt;span&gt;$ cargo build --release
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Download the data
&lt;&#x2F;span&gt;&lt;span&gt;$ .&#x2F;target&#x2F;release&#x2F;page-tracker download --output-dir &amp;quot;&#x2F;mnt&#x2F;analytics_data&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Sample data
&lt;&#x2F;span&gt;&lt;span&gt;$ cat &#x2F;mnt&#x2F;analytics_data&#x2F;2021-10-12T04:00:50Z.csv
&lt;&#x2F;span&gt;&lt;span&gt;path,views
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;about&#x2F;,2
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;dev&#x2F;browsing-w3m-anonymously-with-tor&#x2F;,1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;systemd-timer&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#systemd-timer&quot; aria-label=&quot;Anchor link for: systemd-timer&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Systemd Timer&lt;&#x2F;h3&gt;
&lt;p&gt;To run the CLI as a scheduled job with &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Systemd&quot;&gt;user systemd timers&lt;&#x2F;a&gt;, make sure
the CLI is in the &lt;code&gt;PATH&lt;&#x2F;code&gt; and create these two files:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;&#x2F;&#x2F; ~&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;fnlog-tracker-download.timer
&lt;&#x2F;span&gt;&lt;span&gt;[Unit]
&lt;&#x2F;span&gt;&lt;span&gt;Description=Download page tracker data
&lt;&#x2F;span&gt;&lt;span&gt;Wants=fnlog-tracker-download.timer
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;[Service]
&lt;&#x2F;span&gt;&lt;span&gt;Type=oneshot
&lt;&#x2F;span&gt;&lt;span&gt;ExecStart=page-tracker download --output-dir &amp;quot;&#x2F;mnt&#x2F;analytics_data&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;Environment=PT_JWT=jwt
&lt;&#x2F;span&gt;&lt;span&gt;Environment=PT_ACCOUNT_ID=account_id
&lt;&#x2F;span&gt;&lt;span&gt;Environment=PT_KV_ID=kv_id
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;[Install]
&lt;&#x2F;span&gt;&lt;span&gt;WantedBy=multi-user.target
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;&#x2F;&#x2F; ~&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;fnlog-tracker-timer.timer
&lt;&#x2F;span&gt;&lt;span&gt;[Unit]
&lt;&#x2F;span&gt;&lt;span&gt;Description=Trigger daily analytics download
&lt;&#x2F;span&gt;&lt;span&gt;Requires=fnlog-tracker-download.service
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;[Timer]
&lt;&#x2F;span&gt;&lt;span&gt;Unit=fnlog-tracker-download.service
&lt;&#x2F;span&gt;&lt;span&gt;OnCalendar=*-*-* 12:00:00
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;[Install]
&lt;&#x2F;span&gt;&lt;span&gt;WantedBy=timers.target
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Start and enable them afterwards:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Test if the service works
&lt;&#x2F;span&gt;&lt;span&gt;$ systemctl --user start fnlog-tracker-download.service
&lt;&#x2F;span&gt;&lt;span&gt;$ systemctl --user status fnlog-tracker-download.service
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Start and enable the timer
&lt;&#x2F;span&gt;&lt;span&gt;$ systemctl --user start fnlog-tracker-timer.timer
&lt;&#x2F;span&gt;&lt;span&gt;$ systemctl --user enable fnlog-tracker-timer.timer
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
References&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;blog.tommyku.com&#x2F;blog&#x2F;website-analytics-for-lazy-people-again--with-cloudflare-worker&#x2F;&quot;&gt;Tommy Ku&#x27;s Blog - Website analytics for lazy people again, with Cloudflare Worker&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;workers&#x2F;tutorials&#x2F;workers-kv-from-rust&quot;&gt;Cloudflare Docs - Use Workers KV directly from Rust&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>Firefox Extension: VPN Connectivity Status</title>
          <pubDate>Sat, 02 Oct 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/firefox-extension-vpn-connectivity-status/</link>
          <guid>https://fnlog.dev/wanderer/firefox-extension-vpn-connectivity-status/</guid>
          <description>&lt;h2 id=&quot;motivation&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#motivation&quot; aria-label=&quot;Anchor link for: motivation&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Motivation&lt;&#x2F;h2&gt;
&lt;p&gt;I use &lt;a href=&quot;https:&#x2F;&#x2F;www.perfect-privacy.com&#x2F;&quot;&gt;Perfect Privacy VPN&lt;&#x2F;a&gt; as an additional security and privacy layer
for my internet traffic. While I was able to make it work consistently
with &lt;a href=&quot;https:&#x2F;&#x2F;www.perfect-privacy.com&#x2F;en&#x2F;manuals&#x2F;linux%5Fopenvpn%5Fterminal&quot;&gt;OpenVPN&lt;&#x2F;a&gt; by removing the &lt;a href=&quot;https:&#x2F;&#x2F;openvpn.net&#x2F;community-resources&#x2F;reference-manual-for-openvpn-2-4&#x2F;&quot;&gt;persist-tun&lt;&#x2F;a&gt; option, it was consistently
being stopped by starting &lt;a href=&quot;https:&#x2F;&#x2F;www.docker.com&#x2F;&quot;&gt;docker&lt;&#x2F;a&gt; for my development environment.
Although I have not found the correct fix yet, I want to be visually
alerted while browsing with &lt;a href=&quot;https:&#x2F;&#x2F;www.mozilla.org&#x2F;en-US&#x2F;firefox&#x2F;enterprise&#x2F;&quot;&gt;Firefox&lt;&#x2F;a&gt; whether my VPN is down by checking
this &lt;a href=&quot;https:&#x2F;&#x2F;www.perfect-privacy.com&#x2F;en&#x2F;tests&#x2F;check-ip&quot;&gt;page&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;checkip.perfect-privacy.com&#x2F;json&quot;&gt;json endpoint&lt;&#x2F;a&gt;. A &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;What%5Fare%5FWebExtensions&quot;&gt;browser extension&lt;&#x2F;a&gt; polling the endpoint
could alert me to switch to a privacy browser like &lt;a href=&quot;https:&#x2F;&#x2F;www.torproject.org&#x2F;download&#x2F;&quot;&gt;Tor Browser&lt;&#x2F;a&gt; or
&lt;a href=&quot;https:&#x2F;&#x2F;try.bravesoftware.com&#x2F;&quot;&gt;Brave Browser&lt;&#x2F;a&gt; and possibly restart my VPN. One caveat with this
approach is &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Device%5Ffingerprint#Browser%5Ffingerprint&quot;&gt;browser fingerprinting&lt;&#x2F;a&gt;; however, the extension is simple
enough not to interfere with the browser to be detected but must be
kept in mind when creating extensions.&lt;&#x2F;p&gt;
&lt;p&gt;(The extension can be downloaded &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;firefox-extension-vpn-connectivity-status&#x2F;perfect_privacy_checker-1.0.3-an+fx.xpi&quot;&gt;here&lt;&#x2F;a&gt; and source code found &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;perfect-privacy-extension&quot;&gt;here&lt;&#x2F;a&gt;.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#background&quot; aria-label=&quot;Anchor link for: background&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Background&lt;&#x2F;h2&gt;
&lt;p&gt;Before proceeding, do read &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;Your%5Ffirst%5FWebExtension&quot;&gt;Mozilla&#x27;s first extension guide&lt;&#x2F;a&gt; as the
focus will be on background scripts. The first step in creating the
extension is declaring a &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;manifest.json&quot;&gt;manifest.json&lt;&#x2F;a&gt; similar to a &lt;a href=&quot;https:&#x2F;&#x2F;docs.npmjs.com&#x2F;cli&#x2F;v7&#x2F;configuring-npm&#x2F;package-json&#x2F;&quot;&gt;package.json&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; manifest.json
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;manifest_version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Perfect Privacy Checker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.0.3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Checks if browser is connected to  Perfect Privacy VPN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;homepage_url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;perfect-privacy-extension&#x2F;tree&#x2F;master&#x2F;perfect-privacy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To declare a background script that will poll the endpoint, the
&lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;manifest.json&#x2F;background&quot;&gt;manifest background&lt;&#x2F;a&gt; property should declare the startup scripts:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; manifest.json
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;background&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;scripts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;background.js&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Before creating the background script, a reminder of the JSON output
to be handled:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; https:&#x2F;&#x2F;checkip.perfect-privacy.com&#x2F;json
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Prettified and scrubbed JSON output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;VPN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;TOR&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;IP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;11.222.3.44&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;DNS&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;nowhere2.perfect-privacy.com&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;CITY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;NOWHERE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;COUNTRY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ANYWHERE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Using only plain &lt;a href=&quot;https:&#x2F;&#x2F;plainjs.com&#x2F;javascript&#x2F;ajax&#x2F;send-ajax-get-and-post-requests-47&#x2F;&quot;&gt;Javascript&lt;&#x2F;a&gt; to fetch data from that endpoint via
&lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;XMLHttpRequest&quot;&gt;XMLHttpRequest&lt;&#x2F;a&gt;, the initial &lt;code&gt;background.js&lt;&#x2F;code&gt; looks like:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;js&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-js &quot;&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; background.js
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Store&#x2F;cachea result from the endpoint
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Check connectivity via JSON XHR
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checkStatus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;try &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xhr &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= new &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;XMLHttpRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;open(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;GET&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;checkip.perfect-privacy.com&#x2F;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setRequestHeader(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Content-Type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;application&#x2F;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;onreadystatechange &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;readyState &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;XMLHttpRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;DONE &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp; this&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;status &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;200&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                info &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= JSON&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;responseText)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                info &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            updateStatus()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;catch &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(ex) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; On network error, reset data
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        info &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        updateStatus()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; TODO: Notify extension on status
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;updateStatus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() { }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Check on startup
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checkStatus()
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since the extension makes a cross-domain request, the domain must be
added to the &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;manifest.json&#x2F;permissions&quot;&gt;manifest permissions&lt;&#x2F;a&gt; to allow this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; manifest.json
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;permissions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;webRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;checkip.perfect-privacy.com&#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With the core of the extension above, when does the background script
trigger the check? Rather than polling over an &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;setInterval&quot;&gt;interval&lt;&#x2F;a&gt;, checking when
the browser is active or on focus is good enough. Looking over the
potential &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;manifest.json&#x2F;permissions&quot;&gt;browser events&lt;&#x2F;a&gt; to use, I settled on &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;API&#x2F;tabs&#x2F;onActivated&quot;&gt;tabs.onActivated&lt;&#x2F;a&gt;,
&lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;API&#x2F;tabs&#x2F;onUpdated&quot;&gt;tabs.onUpdated&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;API&#x2F;windows&#x2F;onFocusChanged&quot;&gt;windows.onFocusChanged&lt;&#x2F;a&gt; which covers my use case and
more can be added if needed. Adding event listeners to those:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;js&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-js &quot;&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tabs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;onUpdated&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;addListener(checkStatus)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tabs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;onActivated&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;addListener(checkStatus)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;windows&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;onFocusChanged&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;addListener(checkStatus)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checkStatus()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since the extension does not use privileged aspects of the browser
API, no extra permissions are needed. With this approach though, one
minor caveat is throttling the number of requests since each event
will trigger one network call. Ideally, only one in-flight request
should be allowed and perhaps throttling them every 30 seconds to
avoid making unnecessary requests:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;js&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-js &quot;&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;isPending &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lastTime &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Sketching the `checkStatus` function for only the updated parts
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checkStatus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Make sure only one request is running
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;isPending) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;now &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= new &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Throttle requests for 30 seconds
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(now &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lastTime &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;30000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            lastTime &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        isPending &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;try &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            xhr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;onreadystatechange &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                isPending &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;catch &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(ex) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            isPending &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Before this extension can be tested, a user interface must be
implemented to render the results.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;popup&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#popup&quot; aria-label=&quot;Anchor link for: popup&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Popup&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;Anatomy%5Fof%5Fa%5FWebExtension#sidebars%5Fpopups%5Fand%5Foptions%5Fpages&quot;&gt;Extension pages&lt;&#x2F;a&gt; allow the extension to display an icon and on click
HTML dialog or &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;user%5Finterface&#x2F;Popups&quot;&gt;popup&lt;&#x2F;a&gt; that is declared like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; manifest.json
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;icons&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;icons&#x2F;perfect-privacy-64.png&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;browser_action&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;default_icon&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;icons&#x2F;perfect-privacy-64.png&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;default_title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Connected to Perfect Privacy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;default_popup&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;popup&#x2F;index.html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;When the 64x64 extension icon is clicked, it will render a simple
column-value table based on the endpoint result. A quick
implementation would be:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-html &quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&amp;lt;!-- popup&#x2F;index.html --&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;!&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;DOCTYPE html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;meta &lt;&#x2F;span&gt;&lt;span&gt;charset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;utf-8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;link &lt;&#x2F;span&gt;&lt;span&gt;rel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;stylesheet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;href&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;index.css&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&#x2F;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td &lt;&#x2F;span&gt;&lt;span&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;IP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td &lt;&#x2F;span&gt;&lt;span&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ip-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;N&#x2F;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td &lt;&#x2F;span&gt;&lt;span&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;DNS&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td &lt;&#x2F;span&gt;&lt;span&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;dns-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;N&#x2F;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td &lt;&#x2F;span&gt;&lt;span&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;CITY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td &lt;&#x2F;span&gt;&lt;span&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;city-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;N&#x2F;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td &lt;&#x2F;span&gt;&lt;span&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;COUNTRY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td &lt;&#x2F;span&gt;&lt;span&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;country-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;N&#x2F;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;td&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;script &lt;&#x2F;span&gt;&lt;span&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;index.js&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;css&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-css &quot;&gt;&lt;code class=&quot;language-css&quot; data-lang=&quot;css&quot;&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;body &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;width&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;320&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;margin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;label &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;text-align&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;text-align&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To test running this extension, install &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mozilla&#x2F;web-ext&quot;&gt;web-ext&lt;&#x2F;a&gt;, run &lt;code&gt;web-ext run&lt;&#x2F;code&gt; and
it will look like this:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;firefox-extension-vpn-connectivity-status&#x2F;initial-popup.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Although not the fanciest interface and icon, the next question is how
will the user interface access background script information?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ports&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ports&quot; aria-label=&quot;Anchor link for: ports&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Ports&lt;&#x2F;h2&gt;
&lt;p&gt;Rather, the background script will push data updates for the user
interface to render via &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;API&#x2F;runtime&#x2F;Port&quot;&gt;runtime.Ports&lt;&#x2F;a&gt; or a socket-like connection.
Whenever the extension is clicked, the interface will attempt to
connect to the background script, then the background script will push
the &lt;code&gt;info&lt;&#x2F;code&gt; variable:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;js&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-js &quot;&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; popup&#x2F;index.js
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Connect to the background port
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;port &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;runtime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;connect(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;popup-port&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; On update from the background, render it in the table
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;port&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;onMessage&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;addListener(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    info &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    document&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;getElementById(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ip-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;innerHTML &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;IP &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;N&#x2F;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    document&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;getElementById(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;dns-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;innerHTML &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;DNS &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;N&#x2F;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    document&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;getElementById(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;country-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;innerHTML &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;COUNTRY &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;N&#x2F;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    document&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;getElementById(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;city-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;innerHTML &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;CITY &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;N&#x2F;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The background script must now handle connection event:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;js&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-js &quot;&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; background.js
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Store the active interface connection
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;port &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; On interface connection, update the interface immediately
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;connected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  port &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  updatePort()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;runtime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;onConnect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;addListener(connected)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Simply send the stored `info` variable to the UI
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;updatePort&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(port) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        port&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;postMessage(info)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;updateStatus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; If the VPN is connected, update the extension icon and title to be active or inactive
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;(info &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;VPN) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browserAction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setTitle(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Connected to Perfect Privacy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browserAction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setIcon(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;icons&#x2F;perfect-privacy-64.png&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; } }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browserAction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setIcon(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;icons&#x2F;perfect-privacy-64-inactive.png&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; } }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        browser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;browserAction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setTitle(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Not Connected to Perfect Privacy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Also update the interface
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    updatePort()&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lastly, add the &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;API&#x2F;runtime&#x2F;onMessage&quot;&gt;runtime.onMessage&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;API&#x2F;runtime&#x2F;sendMessage&quot;&gt;runtime.sendMessage&lt;&#x2F;a&gt; permissions
to allow this intercommunication:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;js&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-js &quot;&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; manifest.json
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;permissions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;: [
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;runtime.onMessage&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;runtime.sendMessage&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  ]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, the extension should work and can now be installed:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;firefox-extension-vpn-connectivity-status&#x2F;final-popup.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
References&lt;&#x2F;h2&gt;
&lt;p&gt;Some minor references about this topic:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;wiringbits.net&#x2F;browser-extensions&#x2F;2020&#x2F;11&#x2F;27&#x2F;installing-unsigned-extensions-permanently-to-firefox.html&quot;&gt;Installing unsigned extensions&lt;&#x2F;a&gt;
: If testing the extension locally
is needed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lukaslueg&#x2F;macro%5Frailroad%5Fext&quot;&gt;macro_railroad_ext&lt;&#x2F;a&gt;
: An example non-trivial cross-browser extension
with web assembly.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Elixir Bit - Offline (Docker) Hex Mirror</title>
          <pubDate>Mon, 27 Sep 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/elixir-bit-offline-docker-hex-mirror/</link>
          <guid>https://fnlog.dev/wanderer/elixir-bit-offline-docker-hex-mirror/</guid>
          <description>&lt;h2 id=&quot;motivation&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#motivation&quot; aria-label=&quot;Anchor link for: motivation&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Motivation&lt;&#x2F;h2&gt;
&lt;p&gt;When using docker containers as an Elixir development environment,
bandwidth limitations or frequent network failures can hinder the
development flow as containers before starting check if the
dependencies are updated via &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;mix&#x2F;1.12&#x2F;Mix.Tasks.Deps.Get.html#content&quot;&gt;mix deps.get&lt;&#x2F;a&gt; command. While it is
frustrating to keep retrying on timeout issues, errors from fetching
via &lt;a href=&quot;https:&#x2F;&#x2F;hex.pm&#x2F;&quot;&gt;hex.pm&lt;&#x2F;a&gt; elevates this issue and has been more frequent based on my
co-workers experience that has become a productivity issue. Although
&lt;a href=&quot;https:&#x2F;&#x2F;status.hex.pm&#x2F;uptime&quot;&gt;hex.pm&#x27;s historical uptime&lt;&#x2F;a&gt; does not indicate frequent downtime,
unreliable internet service during peak or working hours may be a
cause. Regardless, it would be nice if the dependencies to fetch for
the Elixir app could be stored offline and fetched locally to avoid
faulty network trips.&lt;&#x2F;p&gt;
&lt;p&gt;(Example repository for this article can be found &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;local%5Fhex%5Fmirror&quot;&gt;here&lt;&#x2F;a&gt;.)&lt;&#x2F;p&gt;
&lt;p&gt;2021-09-29 Update: Add offline support for &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;elixir-bit-offline-docker-hex-mirror&#x2F;#git-repo&quot;&gt;Git dependencies&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hex-dot-registry&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#hex-dot-registry&quot; aria-label=&quot;Anchor link for: hex-dot-registry&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
hex.registry&lt;&#x2F;h2&gt;
&lt;p&gt;When &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hexpm&#x2F;hex&#x2F;releases&#x2F;tag&#x2F;v0.21.0&quot;&gt;hex v0.21.0&lt;&#x2F;a&gt; was released, it came with the ability to self-host
hexpm mirrors via &lt;a href=&quot;https:&#x2F;&#x2F;hex.pm&#x2F;docs&#x2F;self%5Fhosting&quot;&gt;mix hex.registry build&lt;&#x2F;a&gt; command. Assuming an Elixir
app, the custom mirror can be built by:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;$ cd ~&#x2F;my_elixir_app
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Install the latest version of hex &amp;gt;= 0.21.0
&lt;&#x2F;span&gt;&lt;span&gt;$ mix local.hex
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;$ openssl genrsa -out private_key.pem
&lt;&#x2F;span&gt;&lt;span&gt;$ mkdir .hex_repo
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Initialize the hex mirror
&lt;&#x2F;span&gt;&lt;span&gt;# The argument --name=hexpm is important later on
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.registry build .hex_repo --name=hexpm --private-key=private_key.pem
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;public_key
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;tarballs
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;names
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;versions
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The newly created mirror does not have any packages stored yet. To
store a single package in this offline repository, it is fetched
online with &lt;a href=&quot;https:&#x2F;&#x2F;hex.pm&#x2F;docs&#x2F;self%5Fhosting#building-the-registry&quot;&gt;mix hex.package fetch&lt;&#x2F;a&gt; and then moved to the mirror:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;$ cd ~&#x2F;my_elixir_app
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Fetch decimal 2.0.0 package
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.package fetch decimal 2.0.0
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Move to repo&#x2F;tarballs
&lt;&#x2F;span&gt;&lt;span&gt;$ mv decimal-2.0.0.tar .hex_repo&#x2F;tarballs&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Rebuild package indices
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.registry build .hex_repo --name=hexpm --private-key=private_key.pem
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Fetching all the dependencies of the application is a bit more
complicated as it requires parsing the &lt;a href=&quot;https:&#x2F;&#x2F;hex.pm&#x2F;docs&#x2F;usage#fetching-dependencies&quot;&gt;mix.lock&lt;&#x2F;a&gt; to acquire a list of
package and corresponding version. Thankfully, a useful fact about the
lock format is that it is just a serialized Elixir map, meaning we can
just parse and load it via &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;elixir&#x2F;1.12&#x2F;Code.html#eval%5Ffile&#x2F;2&quot;&gt;Code.eval_file&lt;&#x2F;a&gt; and then process it with the
&lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;elixir&#x2F;1.12&#x2F;Enum.html&quot;&gt;Enum module&lt;&#x2F;a&gt; as a simple Elixir script. For example with this sample
lock file:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# mix.lock
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;decimal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;decimal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.8.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a4ef3f5f3428bdbc0d35374029ffcf4ede8533536fa79896dd450168d9acdf3c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;3.1.7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;fa21d06ef56cdc2fdaa62574e8c3ba34a2751d44ea34c30bc65f0728421043e5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;decimal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 1.6&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;decimal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;optional&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]}, {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;jason&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 1.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;jason&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;optional&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]}], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;espec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;espec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.8.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;338d2f49cf4038bf617de7fcb0f92396f31a7b2febf506cfb56a6ac9ac18b802&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;meck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 0.8.13&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;meck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;optional&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]}], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ex_image_info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ex_image_info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0.2.4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;610002acba43520a9b1cf1421d55812bde5b8a8aeaf1fe7b1f8823e84e762adb&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;meck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;meck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0.8.13&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;rebar3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.3.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;nimble_parsec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;nimble_parsec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0.5.3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.9.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;8d7c4e26962283ff9f8f3347bd73838e2413fbc38b7bb5467d5924f68f3a5a4a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 1.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mime&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;optional&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]}, {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;plug_crypto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 1.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;plug_crypto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;optional&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]}, {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;telemetry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 0.4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;telemetry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;optional&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]}], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;plug_crypto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;plug_crypto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1.1.2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;bdd187572cc26dbd95b87136290425f2b580a116d3fb1f564216918c9730d227&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], [], &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A simple script to process it and call &lt;code&gt;mix hex.package fetch&lt;&#x2F;code&gt; for
each package and version would be:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# update_local_repo.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mix_map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, []} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Code&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval_file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix.lock&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Enable mix commands programatically
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mix_map
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Every third entry of the tuple is the exact version
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # entry = {:hex, :decimal, &amp;quot;1.8.1&amp;quot;, &amp;quot;omittedhash&amp;quot;, [:mix], [], &amp;quot;hexpm&amp;quot;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; elem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Optional, remove git packages since they do not have versions but revisions
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # version = {:git, &amp;quot;https:&#x2F;&#x2F;github.com&#x2F;annkissam&#x2F;rummage_ecto.git&amp;quot;, &amp;quot;gitrev&amp;quot;, [branch: &amp;quot;v2.0&amp;quot;]}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;case &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; false
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Optional, sort packages by name to get predicatable progress
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sort_by&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Optional, Task.async_stream is just to parallelize the process. Enum.each also works.
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async_stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Run mix hex.package fetch for each package and store in the mirror
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;shell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix hex.package fetch &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} #{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt; --output .hex_repo&#x2F;tarballs&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;timeout&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;infinity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;max_concurrency&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running the script and rebuilding the mirror afterwards:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;$ elixir update_local_repo.ex
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;ecto v3.1.7 downloaded to .hex_repo&#x2F;tarballs&#x2F;ecto-3.1.7.tar
&lt;&#x2F;span&gt;&lt;span&gt;espec v1.8.1 downloaded to .hex_repo&#x2F;tarballs&#x2F;espec-1.8.1.tar
&lt;&#x2F;span&gt;&lt;span&gt;decimal v1.8.1 downloaded to .hex_repo&#x2F;tarballs&#x2F;decimal-1.8.1.tar
&lt;&#x2F;span&gt;&lt;span&gt;ex_image_info v0.2.4 downloaded to .hex_repo&#x2F;tarballs&#x2F;ex_image_info-0.2.4.tar
&lt;&#x2F;span&gt;&lt;span&gt;mime v1.3.1 downloaded to .hex_repo&#x2F;tarballs&#x2F;mime-1.3.1.tar
&lt;&#x2F;span&gt;&lt;span&gt;meck v0.8.13 downloaded to .hex_repo&#x2F;tarballs&#x2F;meck-0.8.13.tar
&lt;&#x2F;span&gt;&lt;span&gt;nimble_parsec v0.5.3 downloaded to .hex_repo&#x2F;tarballs&#x2F;nimble_parsec-0.5.3.tar
&lt;&#x2F;span&gt;&lt;span&gt;plug v1.9.0 downloaded to .hex_repo&#x2F;tarballs&#x2F;plug-1.9.0.tar
&lt;&#x2F;span&gt;&lt;span&gt;plug_crypto v1.1.2 downloaded to .hex_repo&#x2F;tarballs&#x2F;plug_crypto-1.1.2.tar
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;$ tree .hex_repo&#x2F;tarballs
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;.hex_repo&#x2F;tarballs
&lt;&#x2F;span&gt;&lt;span&gt;├── decimal-1.8.1.tar
&lt;&#x2F;span&gt;&lt;span&gt;├── ecto-3.1.7.tar
&lt;&#x2F;span&gt;&lt;span&gt;├── espec-1.8.1.tar
&lt;&#x2F;span&gt;&lt;span&gt;├── ex_image_info-0.2.4.tar
&lt;&#x2F;span&gt;&lt;span&gt;├── meck-0.8.13.tar
&lt;&#x2F;span&gt;&lt;span&gt;├── mime-1.3.1.tar
&lt;&#x2F;span&gt;&lt;span&gt;├── nimble_parsec-0.5.3.tar
&lt;&#x2F;span&gt;&lt;span&gt;├── plug-1.9.0.tar
&lt;&#x2F;span&gt;&lt;span&gt;└── plug_crypto-1.1.2.tar
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;0 directories, 9 files
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Rebuild package indices
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.registry build .hex_repo --name=hexpm --private-key=private_key.pem
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;decimal
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;ecto
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;espec
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;ex_image_info
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;meck
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;mime
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;nimble_parsec
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;plug
&lt;&#x2F;span&gt;&lt;span&gt;* creating .hex_repo&#x2F;packages&#x2F;plug_crypto
&lt;&#x2F;span&gt;&lt;span&gt;* updating .hex_repo&#x2F;names
&lt;&#x2F;span&gt;&lt;span&gt;* updating .hex_repo&#x2F;versions
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Serving the &lt;code&gt;.hex_repo&lt;&#x2F;code&gt; with any static file server like &lt;a href=&quot;https:&#x2F;&#x2F;nginx.org&#x2F;en&#x2F;&quot;&gt;nginx&lt;&#x2F;a&gt; will
turn this into a proper local &lt;code&gt;hexpm&lt;&#x2F;code&gt; mirror. With just Elixir&#x2F;Erlang,
it can be as simple as:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;$ erl -s inets -eval
&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;inets:start(httpd,[{port,8000},{server_name,&amp;quot;localhost&amp;quot;},{server_root,&amp;quot;.&amp;quot;},{document_root,&amp;quot;.hex_repo&amp;quot;}]).&amp;#39;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;hex-dot-repo&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#hex-dot-repo&quot; aria-label=&quot;Anchor link for: hex-dot-repo&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
hex.repo&lt;&#x2F;h2&gt;
&lt;p&gt;To use the local mirror thought is a bit messy. Remember the name of
the mirror is specifically &lt;code&gt;--name=hexpm&lt;&#x2F;code&gt;, the reason is to circumvent
adding &lt;code&gt;repo: &amp;quot;name_of_repo&amp;quot;&lt;&#x2F;code&gt; for each of the dependency in &lt;code&gt;mix.exs&lt;&#x2F;code&gt;.
To explain further, assuming the name of our mirror is instead
&lt;code&gt;local&lt;&#x2F;code&gt;, the mirror can be registered this way through &lt;a href=&quot;https:&#x2F;&#x2F;hex.pm&#x2F;docs&#x2F;self%5Fhosting#building-the-registry&quot;&gt;mix hex.repo
add&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Notice name is now local instad of hexpm
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.registry build .hex_repo --name=local --private-key=private_key.pem
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Add mirror to hex
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.repo add local http:&#x2F;&#x2F;localhost:8000 --public-key=.hex_repo&#x2F;public_key
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Check if our local mirror is registered
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.repo list
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Name            URL                                                   Public key                                          Auth key
&lt;&#x2F;span&gt;&lt;span&gt;hexpm           https:&#x2F;&#x2F;repo.hex.pm                                   SHA256:O1LOYhHFW4kcrblKAxROaDEzLD8bn1seWbe5tq8TRsk
&lt;&#x2F;span&gt;&lt;span&gt;local           http:&#x2F;&#x2F;localhost:8000                                 SHA256:yRX8noVK1hcBU1e5FA7yv9fhz3v3wlzzF4PCZhwsVeI
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After registering the mirror, every dependency in the application must
add &lt;code&gt;repo: &amp;quot;local&amp;quot;&lt;&#x2F;code&gt; that looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# mix.exs
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deps &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 3.1.7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ex_image_info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 0.2.4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;nimble_parsec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 0.5.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 1.9.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;espec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&amp;gt; 1.8.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Or more generically
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Keyword&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With either method, it should work for simpler projects; however for
my umbrella app with complex dependencies, I get this error with &lt;code&gt;mix deps.get&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;Dependencies have diverged:
&lt;&#x2F;span&gt;&lt;span&gt;* poison (Hex package)
&lt;&#x2F;span&gt;&lt;span&gt;  different specs were given for the poison app:
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;gt; In apps&#x2F;my_umbrella_app&#x2F;mix.exs:
&lt;&#x2F;span&gt;&lt;span&gt;    {:poison, &amp;quot;== 3.1.0&amp;quot;, [env: :prod, hex: &amp;quot;poison&amp;quot;, repo: &amp;quot;local&amp;quot;]}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;gt; In deps&#x2F;elixir_nsq&#x2F;mix.exs:
&lt;&#x2F;span&gt;&lt;span&gt;    {:poison, &amp;quot;~&amp;gt; 3.0&amp;quot;, [env: :prod, repo: &amp;quot;hexpm&amp;quot;, hex: &amp;quot;poison&amp;quot;]}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  Ensure they match or specify one of the above in your deps and set &amp;quot;override: true&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;* conduit (Hex package)
&lt;&#x2F;span&gt;&lt;span&gt;  the dependency conduit in apps&#x2F;my_umbrella_app&#x2F;mix.exs is overriding a child dependency:
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;gt; In apps&#x2F;my_umbrella_apps&#x2F;mix.exs:
&lt;&#x2F;span&gt;&lt;span&gt;    {:conduit, &amp;quot;== 0.12.10&amp;quot;, [env: :prod, hex: &amp;quot;conduit&amp;quot;, repo: &amp;quot;local&amp;quot;]}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;gt; In deps&#x2F;conduit_plugs&#x2F;mix.exs:
&lt;&#x2F;span&gt;&lt;span&gt;    {:conduit, &amp;quot;0.12.10&amp;quot;, [env: :prod, repo: &amp;quot;hexpm&amp;quot;, hex: &amp;quot;conduit&amp;quot;]}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  Ensure they match or specify one of the above in your deps and set &amp;quot;override: true&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;** (Mix) Can&amp;#39;t continue due to errors on dependencies
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The issue here is that the dependency versions and repository are not
the same and adding &lt;code&gt;override: true&lt;&#x2F;code&gt; option does not solve the issue.
Whether it is a bug or not, I was not able to find a fix for this
issue nor should I be required to change my version requirements. So
my unsafe workaround is to override the default &lt;code&gt;hexpm&lt;&#x2F;code&gt; repository
entry with the local one:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Note the repo name is hexpm
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.registry build .hex_repo --name=hexpm --private-key=private_key.pem
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.repo add hexpm http:&#x2F;&#x2F;localhost:8000 --public-key=.hex_repo&#x2F;public_key
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Check if our hexpm repo is overriden
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.repo list
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Name            URL                                                   Public key                                          Auth key
&lt;&#x2F;span&gt;&lt;span&gt;hexpm           http:&#x2F;&#x2F;localhost:8000                                 SHA256:HFj7kHFiEFD7c7YyJ9W9MJATcLKZZsW+4&#x2F;AMs1Znzgo
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;One minor security issue is that the new local repository signature is
not the same as the old online signature. Thankfully, this can be
overriden by the environment variable &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;hex&#x2F;Mix.Tasks.Hex.Config.html&quot;&gt;HEX_NO_VERIFY_REPO_ORIGIN=1&lt;&#x2F;a&gt; and
fetching dependencies via the local mirror now works:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;$ HEX_NO_VERIFY_REPO_ORIGIN=1 mix deps.get
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It may report some fetch error, but it should still work. To revert to
the old repository, download the &lt;a href=&quot;https:&#x2F;&#x2F;hex.pm&#x2F;docs&#x2F;public%5Fkeys#hexpm-public-keys&quot;&gt;online public key&lt;&#x2F;a&gt; to a file and
override &lt;code&gt;hexpm&lt;&#x2F;code&gt; registry again:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Assuming the public key from hex.pm is hex_public_key
&lt;&#x2F;span&gt;&lt;span&gt;$ mix hex.repo add hexpm https:&#x2F;&#x2F;repo.hex.pm  --public-key=hex_public_key
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Almost all dependencies can be fetched locally except for &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;mix&#x2F;1.12&#x2F;Mix.Tasks.Deps.html#module-git-options-git&quot;&gt;git
dependencies&lt;&#x2F;a&gt; since those are fetched with &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;&quot;&gt;git clone&lt;&#x2F;a&gt; and making a local
git repository is beyond the scope of this article. One naive solution
is to build those dependencies with &lt;a href=&quot;https:&#x2F;&#x2F;hex.pm&#x2F;docs&#x2F;publish&quot;&gt;hex.build&lt;&#x2F;a&gt;, copy them into the
mirror and convert their &lt;code&gt;deps&lt;&#x2F;code&gt; entries from &lt;code&gt;git&lt;&#x2F;code&gt; to standard
&lt;code&gt;hexpm&lt;&#x2F;code&gt;; however, this might not be worthwhile to configure per
environment specially when building or releasing remotely with
continuous integration tools or &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;edeliver&#x2F;edeliver&quot;&gt;edeliver&lt;&#x2F;a&gt;. Until &lt;code&gt;hex&lt;&#x2F;code&gt; provides custom
fetchers, leaving the &lt;code&gt;git&lt;&#x2F;code&gt; dependencies alone is safer and still a
win overall.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;docker&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#docker&quot; aria-label=&quot;Anchor link for: docker&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
docker&lt;&#x2F;h2&gt;
&lt;p&gt;Applying this fix back to the docker development environment that uses
&lt;a href=&quot;https:&#x2F;&#x2F;docs.docker.com&#x2F;compose&#x2F;&quot;&gt;docker-compose&lt;&#x2F;a&gt; which typically looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# docker-compose.yml
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Simplified for this example
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;3.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;services&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Any static HTTP server like nginx
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;app_deps&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;nginx:alpine
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;.hex_repo:&#x2F;usr&#x2F;share&#x2F;nginx&#x2F;html
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# The Elixir (phoenix REST API) application
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;bitwalker&#x2F;alpine-elixir
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix phx.server&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Add the registry in the entrypoint
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;entrypoint&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;opt&#x2F;app&#x2F;docker-entrypoint.sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.:&#x2F;opt&#x2F;app
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Use docker volume to avoid conflicting with docker deps folder
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix_deps:&#x2F;opt&#x2F;app&#x2F;deps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Cache the builds to avoid recompilation
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix_build:&#x2F;opt&#x2F;app&#x2F;_build
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Make sure the HTTP server is running before this
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;depends_on&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;app_deps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;links&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;app_deps:app_deps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;environment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Specify the hex repo to register
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;HEX_REGISTRY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;http:&#x2F;&#x2F;app_deps:80&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;mix_deps&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;mix_build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the entrypoint, the local hex mirror is registered if
&lt;code&gt;HEX_REGISTRY&lt;&#x2F;code&gt; is present:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# docker-entrypoint.sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#!&#x2F;bin&#x2F;sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;e
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Allow the image to use the local or online mirror
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[[ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;z &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;${&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;HEX_REGISTRY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;]]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;; then
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Using online hexpm mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hex.repo add hexpm &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;repo.hex.pm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; --&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;public-key&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hex_public_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;export &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;HEX_NO_VERIFY_REPO_ORIGIN&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Using local hexpm mirror: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;HEX_REGISTRY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hex.repo add hexpm &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;HEX_REGISTRY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; --&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;public-key&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.hex_repo&#x2F;public_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;export &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;HEX_NO_VERIFY_REPO_ORIGIN&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Updating dependencies if any uninstalled packages...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; do deps.get
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;exec &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;workflow&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workflow&quot; aria-label=&quot;Anchor link for: workflow&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Workflow&lt;&#x2F;h2&gt;
&lt;p&gt;Whenever &lt;code&gt;mix.lock&lt;&#x2F;code&gt; or any dependencies are changed, the mirror should
be ideally updated and rebuilt as well. One approach specially when
switching branches is to check if &lt;code&gt;mix.lock&lt;&#x2F;code&gt; has changed then rebuild
which looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Check if mix.lock was changed using `md5sum`
&lt;&#x2F;span&gt;&lt;span&gt;touch .mix.lock.old
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;OLD_HASH = $(md5sum &amp;quot;.mix.lock.old&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;cat mix.lock &amp;gt; .mix.lock.old
&lt;&#x2F;span&gt;&lt;span&gt;NEW_HASH = $(md5sum &amp;quot;mix.lock&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;if [ &amp;quot;$OLD_HASH&amp;quot; != &amp;quot;$NEW_HASH&amp;quot; ] ; then
&lt;&#x2F;span&gt;&lt;span&gt;    echo &amp;quot;Updating local mirror&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;    mkdir -p .hex_repo&#x2F;tarballs
&lt;&#x2F;span&gt;&lt;span&gt;    elixir update_local_repo.ex
&lt;&#x2F;span&gt;&lt;span&gt;    mix hex.registry build .hex_repo --name=hexpm --private-key=private_key.pem
&lt;&#x2F;span&gt;&lt;span&gt;fi
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Rather than executing a rebuild per branch or start, perhaps it is
easier to store the local mirror in &lt;code&gt;git&lt;&#x2F;code&gt; so that the person
responsible for the branch should always rebuild the mirror and push
that with the final changes. For my medium-sized project, the size of
my &lt;code&gt;.hex_repo&lt;&#x2F;code&gt; folder is around &lt;code&gt;10MB&lt;&#x2F;code&gt; which is an acceptable
trade-off:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Store the mirror and keys in git
&lt;&#x2F;span&gt;&lt;span&gt;git add .hex_repo private_key hex_public_key update_local_repo.ex
&lt;&#x2F;span&gt;&lt;span&gt;git commit -m &amp;quot;feat: store local repository&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# When working with on a feature branch
&lt;&#x2F;span&gt;&lt;span&gt;git checkout -b feature&#x2F;work
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Assuming a new dependency is added after writing the feature
&lt;&#x2F;span&gt;&lt;span&gt;nano mix.exs
&lt;&#x2F;span&gt;&lt;span&gt;git add mix.exs lib&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Revert to online repository and then pull
&lt;&#x2F;span&gt;&lt;span&gt;mix hex.repo add hexpm &amp;quot;https:&#x2F;&#x2F;repo.hex.pm&amp;quot; --public-key=&amp;quot;hex_public_key&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;mix deps.get
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Rebuild the repository
&lt;&#x2F;span&gt;&lt;span&gt;elixir update_local_repo.ex
&lt;&#x2F;span&gt;&lt;span&gt;mix hex.registry build .hex_repo --name=hexpm --private-key=private_key.pem
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;git add .hex_repo
&lt;&#x2F;span&gt;&lt;span&gt;git commit -m &amp;quot;feat: my new feature&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;git push
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is not a perfect process since people can forget to update the
mirror even with git hooks. Nonetheless, this works to minimize online
fetching and putting the burden on the branch creator rather than its
users.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;git-repo&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#git-repo&quot; aria-label=&quot;Anchor link for: git-repo&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Git Repo&lt;&#x2F;h2&gt;
&lt;p&gt;After this development feature was merged, my co-worker still had
issue specially with the remaining git dependencies. The issue is that
the docker containers does not allow external network access for some
reason. Because debugging the docker network issue could be
potentially hard to resolve, caching the git dependencies is
mandatory.&lt;&#x2F;p&gt;
&lt;p&gt;For each git or more precisely &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;&quot;&gt;GitHub&lt;&#x2F;a&gt; dependency in &lt;code&gt;mix.exs&lt;&#x2F;code&gt;, they
are cloned bare and the paths replicated under a &lt;code&gt;.git_repo&lt;&#x2F;code&gt; folder
that will be similarly served via &lt;code&gt;nginx&lt;&#x2F;code&gt; like with &lt;code&gt;.hex_repo&lt;&#x2F;code&gt;.
Given this &lt;code&gt;mix.exs&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deps &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;elixir_nsq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;wistia&#x2F;elixir_nsq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;b43616a08459451cc5afdcd9839b732cbc1dedfa&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;override&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;rummage_ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;annkissam&#x2F;rummage_ecto.git&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;branch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;v2.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The construction of the new repository would be:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;$ cd ~&#x2F;my_elixir_app
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Create the git repository
&lt;&#x2F;span&gt;&lt;span&gt;$ mkdir .git_repo
&lt;&#x2F;span&gt;&lt;span&gt;$ cd .git_repo
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Clone each git repository bare
&lt;&#x2F;span&gt;&lt;span&gt;$ git clone --bare https:&#x2F;&#x2F;github.com&#x2F;annkissam&#x2F;rummage_ecto.git annkissam&#x2F;rummage_ecto.git
&lt;&#x2F;span&gt;&lt;span&gt;$ git clone --bare https:&#x2F;&#x2F;github.com&#x2F;wistia&#x2F;elixir_nsq.git wistia&#x2F;elixir_nsq.git
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As an Elixir script reading &lt;code&gt;mix.lock&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# update_git_repo.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mix_map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, []} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Code&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval_file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix.lock&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Cleanup git repository folder
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;shell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;rm -rf .git_repo&#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mix_map
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Filter out
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # entry = &amp;quot;elixir_nsq&amp;quot;: {:git, &amp;quot;https:&#x2F;&#x2F;github.com&#x2F;wistia&#x2F;elixir_nsq&amp;quot;, &amp;quot;sharev&amp;quot;, [ref: &amp;quot;sharevused&amp;quot;]}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;github.com&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  _ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; false
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; elem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sort_by&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Task&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async_stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; git_url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; path &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; git_url
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Normalize path ends with .git for bare repositories
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  path &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ends_with?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.git&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;else&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.git&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;shell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;git clone --bare &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;git_url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt; .git_repo&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;timeout&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;infinity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;max_concurrency&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Cloning the whole repo can be huge or unnecessary so adding
&lt;a href=&quot;https:&#x2F;&#x2F;www.git-scm.com&#x2F;docs&#x2F;git-clone#Documentation&#x2F;git-clone.txt---no-single-branch&quot;&gt;--single-branch&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;www.git-scm.com&#x2F;docs&#x2F;git-clone#Documentation&#x2F;git-clone.txt---branchltnamegt&quot;&gt;--branch&lt;&#x2F;a&gt; clone or other filtering options may be
worth investigating. For my same project, it added a hefty &lt;code&gt;5MB&lt;&#x2F;code&gt; for
only 5 or so dependencies which is not ideal. Nonetheless, serving
this &lt;code&gt;.git_repo&lt;&#x2F;code&gt; folder with another &lt;code&gt;nginx&lt;&#x2F;code&gt; container as an alias to
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&quot;&gt;https:&#x2F;&#x2F;github.com&lt;&#x2F;a&gt; is our sneaky strategy similar to overriding
&lt;code&gt;hexpm&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;However, it is not as straightforward as making &lt;code&gt;nginx&lt;&#x2F;code&gt; a compatible
git HTTP server requires &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-http-backend&quot;&gt;git-http-backend&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gnosek&#x2F;fcgiwrap&quot;&gt;fcgiwrap&lt;&#x2F;a&gt; integration that
requires a custom &lt;code&gt;nginx&lt;&#x2F;code&gt; configuration. After some research, the
dockerfile and configuration I landed on is:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;dockerfile&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-dockerfile &quot;&gt;&lt;code class=&quot;language-dockerfile&quot; data-lang=&quot;dockerfile&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Dockerfile.gitx
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; nginx:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;1.21.3-alpine
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Make sure git-http-backend and fcgiwrap is installed
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apk add --update git git-daemon apache2-utils fcgiwrap
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Make sure the git repo root is accessible to nginx
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mkdir -p &#x2F;srv&#x2F;git &amp;amp;&amp;amp; chown -R nginx:nginx &#x2F;srv&#x2F;git &amp;amp;&amp;amp; chmod -R 755 &#x2F;srv&#x2F;git
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;conf&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-conf &quot;&gt;&lt;code class=&quot;language-conf&quot; data-lang=&quot;conf&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# git-nginx.conf
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;server &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Setup HTTP endpoint
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;listen       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;80&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;server_name  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;github&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;com;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Serve every repository under &#x2F;srv&#x2F;git
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;root &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;srv&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;git;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    location &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;try_files &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;$uri $uri&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; =&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;404&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    location ~&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;.*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;client_max_body_size &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;        include       &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;etc&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;nginx&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fastcgi_params;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Found under git-daemon package
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;fastcgi_param &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;SCRIPT_FILENAME     &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;usr&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;libexec&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-core&#x2F;git-http-backend&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Serve every repository under &#x2F;srv&#x2F;git
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;fastcgi_param &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;GIT_PROJECT_ROOT    &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;srv&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;git;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;fastcgi_param &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;GIT_HTTP_EXPORT_ALL &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;fastcgi_param &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;PATH_INFO           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;$1;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# fcgi socket to conect to git daemon
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;fastcgi_pass  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unix&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;:&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fcgiwrap&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sock&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This basic configuration just serves every git repository under
&lt;code&gt;&#x2F;srv&#x2F;git&lt;&#x2F;code&gt; without authentication, so it is only a read or clone only
server. The tricky part here is setting up the &lt;code&gt;fcgiwrap&lt;&#x2F;code&gt; socket before
&lt;code&gt;nginx&lt;&#x2F;code&gt; runs so a custom entrypoint is also needed here:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# git-entrypoint.sh
&lt;&#x2F;span&gt;&lt;span&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;echo &amp;quot;Creating fcgiwrap socket&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;rm -f &#x2F;var&#x2F;run&#x2F;fcgiwrap.sock-1
&lt;&#x2F;span&gt;&lt;span&gt;fcgiwrap -s unix:&#x2F;var&#x2F;run&#x2F;fcgiwrap.sock-1 &amp;amp;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;echo &amp;quot;Waiting on fcgiwrap socket&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;sleep 1
&lt;&#x2F;span&gt;&lt;span&gt;chown nginx:nginx &#x2F;var&#x2F;run&#x2F;fcgiwrap.sock-1
&lt;&#x2F;span&gt;&lt;span&gt;chmod 777 &#x2F;var&#x2F;run&#x2F;fcgiwrap.sock-1
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;echo &amp;quot;Starting nginx&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;nginx -g &amp;#39;daemon off;&amp;#39;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I initially thought of using &lt;a href=&quot;https:&#x2F;&#x2F;docs.alpinelinux.org&#x2F;user-handbook&#x2F;0.1a&#x2F;Working&#x2F;openrc.html&quot;&gt;OpenRC&lt;&#x2F;a&gt; but it was less consistent in
starting up and creating the &lt;code&gt;fcgiwrap&lt;&#x2F;code&gt; socket manually was easier
although slightly less efficient. Regardless, adding HTTPS support or
proxy is the last but easier step which just requires a small &lt;code&gt;nginx&lt;&#x2F;code&gt;
update:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;conf&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-conf &quot;&gt;&lt;code class=&quot;language-conf&quot; data-lang=&quot;conf&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Original HTTP endpoint
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;server &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;listen &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;443&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ssl;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;server_name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;github&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;com;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Generated with
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# openssl req -x509 -nodes -days 365 -subj &amp;quot;&#x2F;C=CA&#x2F;ST=QC&#x2F;O=Company, Inc.&#x2F;CN=mydomain.com&amp;quot; -addext &amp;quot;subjectAltName=DNS:mydomain.com&amp;quot; -newkey rsa:2048 -keyout git-selfsigned.key -out git-selfsigned.crt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;ssl_certificate      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;srv&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;selfsigned&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;crt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;ssl_certificate_key  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;srv&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;selfsigned&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;  location &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;proxy_pass &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;http:&#x2F;&#x2F;127.0.0.1:80&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Wiring it up in &lt;code&gt;docker-compose.yml&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;git_deps&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;.git_repo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dockerfile&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;..&#x2F;Dockerfile.gitx
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;entrypoint&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;sh &#x2F;srv&#x2F;git-entry.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Expose ports for demonstration
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ports&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;22080:80&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;22443:443&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;.git_repo:&#x2F;srv&#x2F;git
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;git-nginx.conf:&#x2F;etc&#x2F;nginx&#x2F;conf.d&#x2F;default.conf
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;git-entrypoint.sh:&#x2F;srv&#x2F;git-entry.sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;git-selfsigned.crt:&#x2F;srv&#x2F;git-selfsigned.crt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;git-selfsigned.key:&#x2F;srv&#x2F;git-selfsigned.key
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;depends_on&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Make this app also wait on the git repo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;git_deps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;app_deps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;links&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Notice how git_deps is mapped as github.com
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# To fetch online, comment this line and GIT_NO_SSL_VERIFY
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;git_deps:github.com
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;app_deps:app_deps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;environment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Also disable check for self signed certificates when cloning
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GIT_NO_SSL_VERIFY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Because of the new &lt;code&gt;links&lt;&#x2F;code&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&quot;&gt;https:&#x2F;&#x2F;github.com&lt;&#x2F;a&gt; now points to the local
git HTTPS server from &lt;code&gt;git_deps&lt;&#x2F;code&gt;. Like with
&lt;code&gt;HEX_NO_VERIFY_REPO_ORIGIN&lt;&#x2F;code&gt;, this will not work as &lt;code&gt;git clone&lt;&#x2F;code&gt; does
not allow self-signed certificates without bypassing it with
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;book&#x2F;en&#x2F;v2&#x2F;Git-Internals-Environment-Variables&quot;&gt;GIT_NO_SSL_VERIFY&lt;&#x2F;a&gt; environment variable similar to
&lt;code&gt;HEX_NO_VERIFY_REPO_ORIGIN&lt;&#x2F;code&gt;. Testing it out with &lt;code&gt;docker-compose up git_deps&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Outsiide the container
&lt;&#x2F;span&gt;&lt;span&gt;# With HTTP
&lt;&#x2F;span&gt;&lt;span&gt;$ git clone http:&#x2F;&#x2F;localhost:22080&#x2F;annkissam&#x2F;rummage_ecto.git
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# With HTTPS
&lt;&#x2F;span&gt;&lt;span&gt;$ git clone https:&#x2F;&#x2F;localhost:22443&#x2F;wistia&#x2F;elixir_nsq.git
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Within the container
&lt;&#x2F;span&gt;&lt;span&gt;# docker-compose exec app ash
&lt;&#x2F;span&gt;&lt;span&gt;$ GIT_SSL_NO_VERIFY=true git clone https:&#x2F;&#x2F;github.com&#x2F;wistia&#x2F;elixir_nsq.git
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While not the most optimal solution, it does resolve my co-worker&#x27;s
issue and the development environment is now completely offline aside
from extra build hooks. Remember to store &lt;code&gt;.git_repo&lt;&#x2F;code&gt; and its
accompanying files. Whenever a git dependency needs to be updated,
delete and clone the bare repository needed and commit again.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Mundaun - Notes and Thoughts</title>
          <pubDate>Sun, 16 May 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/mundaun-notes-and-thoughts/</link>
          <guid>https://fnlog.dev/gamer/mundaun-notes-and-thoughts/</guid>
          <description>&lt;h2 id=&quot;mundane&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#mundane&quot; aria-label=&quot;Anchor link for: mundane&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Mundane&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Finished main content at around 6 hours on May. 02, 2021&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.mundaungame.com&#x2F;&quot;&gt;Mundaun PS4&lt;&#x2F;a&gt; is a first-person horror mystery adventure game with a
hand-penciled sepia aesthetic where the player journeys to his
grandfather&#x27;s funeral and unravel his deal with a demonic spirit. What
makes this standout aside from its strong visuals is the language and
beliefs in the small village that radiates a sense of allure and
mystery. While this game is highly artistic and shows passion, its
gameplay aspect pull this game down severely. I like this short game and
recommend it but do know it has severe flaws.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes-and-thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes-and-thoughts&quot; aria-label=&quot;Anchor link for: notes-and-thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes and Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;To preface my criticism with the game&#x27;s good points, I like the story
idea of a devil&#x27;s bargain where the next generations pay the price. The
mystery presented also heightened the atmosphere and tone alongside the
sepia imagery and cinematography makes this experience memorable.
Enemies have unique designs, low weapon durability and item scarcity
increases the tension. For a small indie game with this amount of effort
and artistic merit, it is impressive and should be commended, so these
issues are painful to raise.&lt;&#x2F;p&gt;
&lt;p&gt;The biggest issue with the game is the pacing and story progression. As
the story is about an intriguing curse, many of the story objectives
feel unrelated or padding and does not feel insightful or rewarding.
While a short story is fine, the objectives can be reworked to feel more
engaging and involved rather than meandering. For example, a road block
could be an invincible monster that can be weakened then killed in
several ways or a fetch quest could be a multi-item inventory puzzle
that can enhance exploration and world building. When the story and
pacing picks up, the game is at its best but that is between long
stretches of uninteresting traversal.&lt;&#x2F;p&gt;
&lt;p&gt;Navigating or exploring the world is tedious and uninteresting as this
undermines the atmosphere and pacing. For this kind of first-person
exploration, a combination of well-designed maps, enemies, abilities and
pacing can remedy this. Aside from increasing the enemies at strategic
points, improving enemy design I believe can be the most effective since
most enemies are simply long range units that can be easily outrun or
evaded making them more of an annoyance than a genuine threat. If adding
new monsters and abilities is not possible, adjust from the player&#x27;s
side can work such as limited health with recovery items instead of
auto-recovery, items to draw attention or stun such as rocks, slower
move speed when detected and so on. While increasing difficulty must be
balanced against being challenging or frustrating, this can make
exploration tense and treacherous while also making its atrocious
backtracking meaningful.&lt;&#x2F;p&gt;
&lt;p&gt;The story experience is short and unique but unsatisfying for me with
many questions about the mechanics of the world. How the protagonist&#x27;s
curse is removed does not make sense since it was not building up to it
nor attention to actually removing it. I felt the resolution with the
demon was a narrative contrivance although I did like uncovering the
demon&#x27;s secret. Alongside the game its moments, the narrative payoff
does not feel rewarding despite its allure.&lt;&#x2F;p&gt;
&lt;p&gt;While the game&#x27;s aesthetic is a strength, it can also be a flaw within
the item hunting mechanics. Since everything is sepia toned, it is hard
to find items which could be addressed as hard contrast or highlights
accessibility options. Same issue within the inventory that is it hard
to know which is the current item again can be resolved with highlights.
While the sepia tone is unique, some people might have color blindness
so providing visual accessibility options would be welcome. As a
first-person game, it is also lacking in options such as field of view,
sensitivity and so-on to prevent motion sickness specially when driving
the truck. Nonetheless, the visuals is still a strength and can be
experienced better with more options for it.&lt;&#x2F;p&gt;
&lt;p&gt;The combat system is simple but requires more polish. For the pitchfork,
attacking sometimes does not trigger and feels unreliable. The attribute
bonuses that provide increased health, fear resistance and rifle
accuracy should be removed as the game is already easy or turn them into
temporary bonuses or usage based instead although I do like making
coffee here. For the rifle, weapon sway and limited ammo is nice but
accessing the inventory to reload instead of a weapon reload animation
is strange. When doing damage from stealth, a notification appears which
break its aesthetic and should be removed. For the inventory, the game
lacks enough usable items or complex interactions to warrant the current
inventory system. The inventory should also stop time as it is hard to
access the correct item or allocate a button to cycle with relevant
items if it cannot be removed. While the game discourages combat,
engaging in it should be smooth to avoid ruining immersion.&lt;&#x2F;p&gt;
&lt;p&gt;I do have other issues such as the immense loading times, harsh bee
sound effects, truck handling, fast run speed and so on but these are
minor. Nonetheless, this game will be remembered despite its shortcoming
which can hopefully inspire more kinds of this game.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Rogue Heroes: Ruins of Tasos - Notes and Thoughts</title>
          <pubDate>Sat, 10 Apr 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/rogue-heroes-ruins-of-tasos/</link>
          <guid>https://fnlog.dev/gamer/rogue-heroes-ruins-of-tasos/</guid>
          <description>&lt;h2 id=&quot;rogue-heroes-ruins-of-tasos&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rogue-heroes-ruins-of-tasos&quot; aria-label=&quot;Anchor link for: rogue-heroes-ruins-of-tasos&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Rogue Heroes: Ruins of Tasos&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Finished the main content on Switch around 14 hours&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.team17.com&#x2F;games&#x2F;rogue-heroes-ruins-of-tasos&#x2F;&quot;&gt;Rogue Heroes: Ruins of Tasos&lt;&#x2F;a&gt; is a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FLegend%5Fof%5FZelda&quot;&gt;The Legend of Zelda&lt;&#x2F;a&gt; inspired from its
pixel art style, top-down perspective, map grid, room puzzles, item
progression and so on. Primarily, it is a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Roguelike&quot;&gt;rogue-lite&lt;&#x2F;a&gt; featuring multiple
classes, statistical progression, procedurally dungeons, town building,
and multiplayer. While the game may be fine for what it is, it feels
lacking in content, complexity and challenge to be valuable or
meaningful.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes-and-thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes-and-thoughts&quot; aria-label=&quot;Anchor link for: notes-and-thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes and Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;Initially I had fun specially with multiplayer hijinks, my enjoyment and
investment was ruined with many issues. Primarily, its core dungeon loop
does not feel rewarding because of the bosses, combat, puzzles and
difficulty.&lt;&#x2F;p&gt;
&lt;p&gt;As a dungeon crawler, dungeon bosses test and challenge players about
the game&#x27;s different aspects in general. Aside from the basic patterns
and concepts, they do not exercise mechanics or incorporate items to
make it exciting or technical. Regardless of that, boss patterns are
simplistic or uninteresting and some can be trivialized with the builtin
shield. The final boss is almost an exception which provide a mechanical
challenge; however, it feels unpolished and unfair with its execution
and randomness. Overall, bosses are forgettable and unremarkable.&lt;&#x2F;p&gt;
&lt;p&gt;As a &lt;em&gt;Zelda&lt;&#x2F;em&gt; inspired game, sword attacks are the main form of damage;
however, it means the combat is primarily slashing an enemy and running
away which becomes stale without complexity or depth. The game already
provides other items and weapons such as a bow, wand or hammer; however,
they are limited by a mana attribute or item capacity which may be
intended as secondary weapons. The problem with them as secondary
weapons is that they do not do enough damage until upgraded but would be
better well spent on upgrading the sword instead which perpetuates the
lack of complexity. In short, the game discourages ranged weapons or
items without providing depth to the only viable weapon.&lt;&#x2F;p&gt;
&lt;p&gt;While I can only talk about local co-op, the huge enemy knockback from
sword attacks is dangerous to allies specially with the high contact
damage. The sword range is too close or enemies do not get consistent
hit stun that enemies accidentally do contact damage even with sword
range upgrades which is personally infuriating and encourages splitting
up. Aside from reviving allies, no major mechanic encourages cooperation
which makes the multiplayer feel tacked on.&lt;&#x2F;p&gt;
&lt;p&gt;Alongside that issue is the class system which is supposed to give
different playstyles or builds. The game lets you pick from 8 unlockable
classes which differ mostly in their special move, class bonus, attack,
defense and speed. Since swords are the most viable, picking a ranged
class or non-melee class like the ranger or mage is not good. What dooms
them further is their low defense which receives extremely high damage
compared to their melee counterparts which feels unfairly balanced or
skewed. The special traits and moves from the melee classes are
underwhelming or bland given the effort to acquire them. Either the
class system has to be balanced better or remove it altogether since it
is deceptively dull.&lt;&#x2F;p&gt;
&lt;p&gt;Another staple of &lt;em&gt;Zelda&lt;&#x2F;em&gt; games are their puzzles which provide an
intellectual challenge and heighten environmental awareness. Regardless
of actual quality of the puzzles, my main complaint is the repetition of
room puzzles. While repeating a puzzle on its own is not a strong issue,
it makes exploration tedious and slow as it becomes a chore over
multiple runs. The game seems to acknowledge this by making certain
puzzles remain solved where it might be better to replace it with
another generated room instead. If puzzles becomes a dungeon chore, it
would be better to put them in the outside world to be more creatively
designed and make traveling a more rewarding experience which the game
poorly leans on with the other dungeons. The kind of dungeon puzzles the
game uses does mesh well with the repetitive nature of the game, so
removing it can make the overall pacing better and perhaps provide
challenge modifiers&#x2F;rooms instead for room rewards.&lt;&#x2F;p&gt;
&lt;p&gt;While I may have other smaller issues, the game fails in both being an
engaging dungeon crawler &lt;em&gt;Zelda&lt;&#x2F;em&gt; or &lt;em&gt;rogue-lite&lt;&#x2F;em&gt; experience. Personally,
I would probably enjoy the game more if it was not dependent on its poor
&lt;em&gt;rogue-lite&lt;&#x2F;em&gt; aspect to prolong the game.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Violet Evergarden - Notes and Thoughts</title>
          <pubDate>Fri, 26 Feb 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/watcher/violet-evergarden-notes-and-thoughts/</link>
          <guid>https://fnlog.dev/watcher/violet-evergarden-notes-and-thoughts/</guid>
          <description>&lt;h2 id=&quot;violet-evergarden&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#violet-evergarden&quot; aria-label=&quot;Anchor link for: violet-evergarden&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Violet Evergarden&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Finished season 1 of the television series&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;No letter that could be sent deserves to be undelivered&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Violet%5FEvergarden&quot;&gt;Violet Evergarden (Season 1)&lt;&#x2F;a&gt; is an Japanese animated television series
where an emotionally stunted ex-child soldier becomes a ghostwriter
(known as &lt;em&gt;Auto Memory Dolls&lt;&#x2F;em&gt;) after the war to understand the last
words of her superior officer and guardian who sacrificed his life to
save her: &lt;em&gt;I love you&lt;&#x2F;em&gt;. Those last words does not matter literally but
rather &lt;em&gt;optimally&lt;&#x2F;em&gt; conveys to &lt;em&gt;Violet&lt;&#x2F;em&gt; that somebody cares and wants her
to be have a future. Whatever form of love they might have had, &lt;em&gt;Violet&lt;&#x2F;em&gt;
did love and care for somebody thus understanding the meaning of those
words is coming to terms with her own feelings and how important those
are. The show has a good premise of understanding people&#x27;s feelings
through the letters they write which is charming and sentimental. With
13 episodes, the series explores &lt;em&gt;Violet&lt;&#x2F;em&gt;&#x27;s growth and journey through
her clients and friends in an emotionally resonant manner.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes-and-thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes-and-thoughts&quot; aria-label=&quot;Anchor link for: notes-and-thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes and Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;Now as much as I like the series and its idea, I cannot fully recommend
this show because of its execution although this is still good and
emotional. Primarily, if the series is about conveying the subtleties of
feelings, the show lacks that quality to engage the viewers with its
subtleties. Characters&#x2F;clients frequently say exactly what they mean
removing any mystery, tension or possible failure. &lt;em&gt;Violet&lt;&#x2F;em&gt; explicitly
stating contradictions where she could have been taught to remain silent
and take note of the circumstances. Flashbacks are used too much where
moments of silence or stillness would be better. The broken doll analogy
is on the nose considering her job title, clothing style, robotic arms
and lack of emotion. Her introductions along with that seems excessive
as well. Perhaps I expected too much but it certainly felt that the
stories could be better expressed and engaging without compromising its
tone and feel.&lt;&#x2F;p&gt;
&lt;p&gt;The premise of understanding those last words while intriguing is
slightly problematic as a setup and how it was handled. At face value,
those words are typically interpreted as romantic which is questionable
between an older man and teenager and more importantly becomes an
unnecessary hurdle or discussion. While the series show it is nuanced,
it could have been better handled or framed such as quickly offering
different interpretations initially then exploring it further. Since
&lt;em&gt;Violet&lt;&#x2F;em&gt; can learn quickly, I am bothered it was not shown her intensely
researching or thinking about it then eventually being conflicted which
would provide more insight and character. Regardless how the
relationship may seem dependent, more scenes are needed from her
guardian as well as showing them chronologically closer to provide
better clarity and context to avoid misinterpretation.&lt;&#x2F;p&gt;
&lt;p&gt;Her mature doll-like appearance is also questionable considering she is
around 14 years old at near the start of the series. While this world&#x27;s
rules about age and marriage might be contextually different, perhaps a
different model and design in particular her face and height would show
her slowly maturing age better without undermining her profession. My
sense of fashion for her would be pants, long shirt, a vest, a beret and
add frills or the appropriate mid-upper class traveling working girl
fashion. Showing or framing her as introspective instead of beautiful
would help and besides she is not romantically available yet.&lt;&#x2F;p&gt;
&lt;p&gt;One minor point with those last words is that perhaps the client stories
and letters should incorporate those words as well. It is established
that &lt;em&gt;Violet&lt;&#x2F;em&gt; may not be able to use those words, but perhaps the act of
writing and including it on behalf of the client can be meaningful. As
it stands, the different forms of love displayed by the clients may seem
unrelated. Not truly an issue but would be a nice incorporation.&lt;&#x2F;p&gt;
&lt;p&gt;A world building issue is what makes a ghostwriter good in this universe
specially how &lt;em&gt;Violet&lt;&#x2F;em&gt; can ever became competent given her mechanical
mindset and lack of emotion. Although a bad ghostwriter was shown
through her coworker, perhaps showing a competition between two good
ghostwriters could highlight its nuances and technicalities without
ruining the tone. While it may be considered part of the premise, it
felt a part of her key progression or growth was rushed or waved away
where a montage or time skip could address.&lt;&#x2F;p&gt;
&lt;p&gt;While it is acceptable &lt;em&gt;Violet&lt;&#x2F;em&gt; herself lacks emotion, I do not buy the
lack of emotion for a lack of a strong personality. The fact that
episodes are narrated or described by other characters do not help and
somehow seem to require &lt;em&gt;Violet&lt;&#x2F;em&gt; to always make an impression may be
detrimental. Perhaps showing how her military and ghostwriting
experience allowed her to resolve an personal issue without violence
would give her color and depth. Maybe using her namesake to build
interest in flowers or gardening would be something. Either way, I
sympathize with her but the series did not giver her flavor.&lt;&#x2F;p&gt;
&lt;p&gt;While I do have smaller issues, these overall do not ruin a good show
but it does pull it down from being recommended. I still like the
post-war setting, reintegration of an ex-soldier, romanticizing letter
writing, and the cathartic ending but the &lt;em&gt;optimal&lt;&#x2F;em&gt; words should have
been what the series started with.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Rust Bit - Borrow Multiple Struct Fields</title>
          <pubDate>Tue, 09 Feb 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/rust-bit-borrow-multiple-struct-fields/</link>
          <guid>https://fnlog.dev/wanderer/rust-bit-borrow-multiple-struct-fields/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I have a struct that contains other components:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ArithmeticLogicUnit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ControlUnit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CPU &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; ArithmeticLogicUnit,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; ControlUnit,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; Register
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Default &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CPU &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ArithmeticLogicUnit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ControlUnit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Register
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I want to test a function &lt;code&gt;execute&lt;&#x2F;code&gt; which changes each component
state:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Main function to test
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CPU &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;execute&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;instructions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;todo!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Functions to check side-effects which may require mutable references
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ArithmeticLogicUnit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Register &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ControlUnit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Register &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mod &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tests &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;execute_should_work&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CPU&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;execute&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;RANDOM CPU INSTRUCTIONS&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; TODO: Assert ALU, CU and Register side-effects
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To test each component state directly, I need to expose mutable access
to those components since some components depend on each other. The
easiest way to achieve this is to change the &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;reference&#x2F;visibility-and-privacy.html&quot;&gt;visibility&lt;&#x2F;a&gt; of the struct
fields from private to public:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Add `pub` for each field
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CPU &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; ArithmeticLogicUnit,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; ControlUnit,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; Register
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CPU&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;execute&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;BLARB&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CPU &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; register &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, this unnecessarily exposes the internal fields outside of a
test. As an alternative, I could expose &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Mutator%5Fmethod&quot;&gt;getter methods&lt;&#x2F;a&gt; for each the
components:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CPU &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ArithmeticLogicUnit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;            &amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; ArithmeticLogicUnit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ControlUnit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; ControlUnit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Register &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Register &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Borrowing immutable references simultaneously works but naturally
fails for mutable references:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Immutable references works
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CPU&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; alu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; register &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Mutable references does not since `cpu` is exclusively borrowed for
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; each component
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CPU&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; alu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; register &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While the borrow checker correctly prevents mutably borrowing the same
variable, how can we borrow multiple fields at the same time without
reaching for &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;nomicon&#x2F;borrow-splitting.html&quot;&gt;unsafe&lt;&#x2F;a&gt;?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;solution&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#solution&quot; aria-label=&quot;Anchor link for: solution&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Solution&lt;&#x2F;h2&gt;
&lt;p&gt;Taking inspiration from &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;vec&#x2F;struct.Vec.html#method.split%5Fat%5Fmut&quot;&gt;Vec::split_at_mut&lt;&#x2F;a&gt;, the unconventional yet
slightly verbose answer is to mutable borrow everything required and
return it as a struct which combines the two ideas:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Combining the first and second solution
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CpuComponents&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;  pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a ArithmeticLogicUnit,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;  pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a ControlUnit,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;  pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a Register,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CpuComponentsMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;  pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut ArithmeticLogicUnit,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;  pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut ControlUnit,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;  pub &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut Register,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CPU &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;components&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CpuComponents&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        CpuComponents &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;components_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CpuComponentsMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        CpuComponentsMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although it seems strange to create a custom data type just to satisfy
the borrow checker, &lt;em&gt;Rust&lt;&#x2F;em&gt; has smart pointers such as &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;cell&#x2F;struct.RefCell.html&quot;&gt;RefCell&lt;&#x2F;a&gt; to
enforce borrows rules at runtime. Nonetheless, the test can now work
naturally.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;CPU&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; CpuComponentsMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; register &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;components_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If structs are a bit verbose, tuples can also work but be wary that it
breaks when adding or changing it:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;CPU &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;components&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; ArithmeticLogicUnit, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; ControlUnit, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;components_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; ArithmeticLogicUnit, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; ControlUnit, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; alu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cpu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;components_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although my example may seem valid within a test, exposing internals
should be avoided and perhaps refactoring or new methods may be needed
instead. Overall while this perhaps incurs a slight compiler or code
overhead, maintaining the safety guarantees is worth it with a little
more work.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Darkwood - A Strong Top-Down Horror</title>
          <pubDate>Sun, 07 Feb 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/darkwood-a-strong-top-down-horror/</link>
          <guid>https://fnlog.dev/gamer/darkwood-a-strong-top-down-horror/</guid>
          <description>&lt;h2 id=&quot;darkwood&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#darkwood&quot; aria-label=&quot;Anchor link for: darkwood&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Darkwood&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Finished at Nightmare difficulty on PS4&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a difficult and unforgiving game. Be patient. Respect the
woods.&lt;&#x2F;p&gt;
&lt;p&gt;-- Darkwood&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;www.darkwoodgame.com&#x2F;&quot;&gt;Darkwood&lt;&#x2F;a&gt; is a great survival and horror game with a top-down
camera&#x2F;perspective. The game is about an amnesiac trapped deep within
a paranormal forest who must escape its warped ecosystem and
inhabitants or else be consumed it. While trying to survive, every day
the player has 12 minutes of light to scavenge and explore the forest
and 5 minutes of darkness to hunker down in a hideout and survive the
deadly creatures and random events which is the primary game loop.
What makes this game special is its emphasis on challenge with its
finite resources, item scarcity, stiff combat, weapon durability, low
health, limited sight and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Permadeath&quot;&gt;permadeath&lt;&#x2F;a&gt; which all provide a gripping
mechanical tension. Compounding the difficulty, the horror taps into
the fear of the unknown with its visual line of sight or darkness,
tense sound design, procedurally generated maps, nightly threats,
ambiguous characters and consequences overall creating a tense and
atmospheric horror experience. While it only has two chapters and an
epilogue, this can take around 25 hours on fully exploring the world
and story including the multiple deaths or runs incurred.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#thoughts&quot; aria-label=&quot;Anchor link for: thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;Aside from its nicely executed resource survival aspect, the
interesting aspect of this game is its horror and challenge stemming
from it. Horror is hard to define and quite subjective based on
personal and past experiences. Instead, several aspects of the game
build an oppressive and terrifying atmosphere that overall create a
strong horror gameplay experience.&lt;&#x2F;p&gt;
&lt;p&gt;The first noteworthy thing is the top-down perspective itself which is
an unconventional choice for horror. With this perspective, it uses an
intriguing lighting system based on the character&#x27;s directional vision
cone which can be obstructed and everything else darkened and
masked&#x2F;disguised until seen directly. While the player can see the
whole screen, they can only see what the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Player%5Fcharacter&quot;&gt;player character&lt;&#x2F;a&gt; does and the
game plays with that fear of the unknown such as hidden enemies, traps
or simply unknown creatures moving in the dark. Since the game forces
the player to hunker down every night, the player feels helpless
against this darkness and must accept that it cannot be conquered.&lt;&#x2F;p&gt;
&lt;p&gt;Since sight is unreliable, directional audio cues can alert the player
from nearby enemies or items by their growls or pulse. During the
night, this alertness is heightened where other audio cues such as
footsteps, opening doors or banging induce paranoia and stress until
the harmony of daybreak. The background and ambient music specially
after the night builds the slow and creeping fear and the relief
appropriately.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from traps, the primary threat of this game are the enemies. The
stamina-based combat system of this game is stiff and rigid as the
player needs weapons which cost resources to use and repair as well as
risky with the high damage from enemies, unrewarding loot drop and
specially permadeath. The player must efficiently scavenge materials
for weapons and defense as the night enemies will eventually find the
player and require combat to maintain a safety zone. Enemies do not
get easier and the resources required increase which feed into the
game&#x27;s resource scarcity. Even if a daily &lt;a href=&quot;https:&#x2F;&#x2F;darkwood.fandom.com&#x2F;wiki&#x2F;Trader&quot;&gt;trader NPC&lt;&#x2F;a&gt; trades goods, the
aggression increases over time and so is the average resources
required. By making enemies and combat dangerous and resource
intensive, the player is must always be careful and respect the woods.&lt;&#x2F;p&gt;
&lt;p&gt;Lastly without a tutorial, the game wants the player to begin and
expect the discomfort and uncertainty of the world. Even the
characters including the player&#x27;s are strange humans physically or
mentally affected by the forest which defy reality and sanity. Their
stories and requests are vague and hide or lack information which
complicates the player&#x27;s actions and expectations. By the end of the
game, the player may have escaped the forest, but not understood it
and possibly changed for the worst by it. The game does not happy
endings or resolutions and this feeling of ambiguity reaches the
player&lt;&#x2F;p&gt;
&lt;p&gt;A minor point, the &lt;a href=&quot;https:&#x2F;&#x2F;darkwood.fandom.com&#x2F;wiki&#x2F;Skills&quot;&gt;skills&lt;&#x2F;a&gt; progression provide interesting powers and
abilities specially at higher levels but requires a &lt;a href=&quot;https:&#x2F;&#x2F;darkwood.fandom.com&#x2F;wiki&#x2F;Skills#Negative%5FTraits&quot;&gt;negative trait&lt;&#x2F;a&gt; at
each tier level or roughly for every two upgrades which is
interesting. While I like the negative traits threaten survival, they
are somewhat too strong where it might be better not to level up.
Personally in my runs, most active skills can only be activated once a
day that I forgot about them as well as the passive one. The skills
are not badly designed but rather my play style does not use&#x2F;encourage
skills and perhaps should not have dealt with the side-effects.
Looking back, the level progression is surprisingly optional and
engaging with it provides an interesting and conscious trade-off while
supporting the idea of being mutated by the forest and the challenging
nature of the game itself. After finishing the game, I suggest trying
out new runs without skills or randomly selecting them to spice them
up.&lt;&#x2F;p&gt;
&lt;p&gt;The game overall presents a tense horror gameplay that is well
balanced and designed. It could use some personal improvements such as
inventory sorting, the ability to skip dream sequences, more nightly
events, more skills&#x2F;traits and so on but it is fine as is. My advice
to new players is begin the game at &lt;em&gt;Nightmare&lt;&#x2F;em&gt; difficulty as well so
that decisions and mistakes have tangible tension or loss. I am happy
to recommend this horror game but remember to respect the forest.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Rust Bit - Folding A Recursive Parser</title>
          <pubDate>Mon, 18 Jan 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/rust-bit-folding-a-recursive-parser/</link>
          <guid>https://fnlog.dev/wanderer/rust-bit-folding-a-recursive-parser/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I want to write a toy &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-rev-parse&quot;&gt;git revision parser&lt;&#x2F;a&gt; (without input validation)
which parses the base revision name then zero or more suffixes, &lt;code&gt;^&lt;&#x2F;code&gt;
and &lt;code&gt;~(n)&lt;&#x2F;code&gt;, into a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch15-01-box.html?highlight=recursive#enabling-recursive-types-with-boxes&quot;&gt;recursive data structure&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Revision as a recursive struct
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub enum &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Revision &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Ancestor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Revision, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;todo!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Basic Pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;master&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;master&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;main^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;feature&#x2F;banana-bread~3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ancestor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;feature&#x2F;banana-bread&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Nested Pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;develop^^^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;develop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()))))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;origin&#x2F;deployment&#x2F;1.2.3~5^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ancestor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;origin&#x2F;deployment&#x2F;1.2.3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A quick way to parse it recursively with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;regex&quot;&gt;regex&lt;&#x2F;a&gt; would be:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;macro_use&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;extern crate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; lazy_static&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1.4.0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;regex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Regex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1.4.2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Revision, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;lazy_static! &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static ref &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;PARENT&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Regex &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Regex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;^(.+)\^$&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;static ref &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ANCESTOR&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Regex &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Regex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;^(.+)~(\d+)$&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;captures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;PARENT&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;captures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_input &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; captures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_rev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inner_input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_err&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Parse error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inner_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;captures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ANCESTOR&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_input &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; captures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; captures&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_err&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Parse error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_rev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inner_input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_err&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Parse error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ancestor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inner_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, this inefficiently parses the whole text for each suffix or
nesting. Using the parser combinator &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Geal&#x2F;nom&quot;&gt;nom&lt;&#x2F;a&gt; instead, parsing can be
better expressed and extended:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;NOTE&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;: While this is not a tutorial of &lt;code&gt;nom&lt;&#x2F;code&gt; which you should check
out, this is about a pitfall&#x2F;trap with a recursive design. Do pay more
to the general idea than the actual code.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;nom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 5.1.1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;branch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;complete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; take_till&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;character&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;complete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;digit1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;combinator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;all_consuming&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; map_res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;sequence&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;preceded&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    IResult
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Parse base REF_NAME
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ref_name &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        take_till&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;b &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;||&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; b &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;ref_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ref_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ref_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Parse carret suffix REV^
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_caret&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;inner_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; suffix &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inner_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Parse tilde suffix REV~n
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_tilde&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;inner_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; number &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;digit1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;digits&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;digits&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; suffix &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;preceded&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; number&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ancestor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inner_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Parse suffixes recursively
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; suffix &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Check for REV^ suffix
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        parse_caret&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Check for REV~n suffix
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        parse_tilde&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; If neither and the whole input is consumed, return the current revision
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;all_consuming&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;move |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; next_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_empty&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; If nothing else to parse, return the current result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; next_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Otherwise, parse recursively
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            parse_suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Main parsing function
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Parse the bottommost revision
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; base_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Build the revision recursively
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;base_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The equivalent recursive parser reads the input once and builds the
revision bottom-up; however, the suffix parser (&lt;code&gt;parse_suffix&lt;&#x2F;code&gt;) clones
the current revision too much (3 times) for each test. While it can be
refactored, recursion is usually harder to optimize and satisfy with
the borrow checker.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;rust-bit-folding-a-recursive-parser&#x2F;recursive.rs&quot;&gt;Recursive Source Code&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;solution&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#solution&quot; aria-label=&quot;Anchor link for: solution&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Solution&lt;&#x2F;h2&gt;
&lt;p&gt;Instead of using recursion, an iterative approach can perform better.
Rather than immediately building the revision at each recursion or
iteration, the newly parsed parent revision can have an empty child
revision which can be replaced later and makes each parser cleaner
without requiring ownership or reference to the actual child revision:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Create a default for `Revision`
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Default &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Revision &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Without the child revision argument, the parsing is simpler
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_caret&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; suffix &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Create empty revision to be replaced later
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; empty_rev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;empty_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Ditto
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_tilde&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; number &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;digit1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;digits&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;digits&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; suffix &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;preceded&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; number&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; empty_rev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ancestor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;empty_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Refactoring the main suffix parser into an iterative loop:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Revision, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; The branch parser is simpler as well
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; suffix &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        parse_caret&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        parse_tilde&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Until the whole input is parsed&#x2F;consumed
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while !&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_empty&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Parse the next parent revision
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; acc_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; To replace the parent&amp;#39;s empty child revision, the child is pattern matched
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= match &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; acc_rev &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unreachable!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ancestor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Then replaced via `std::mem::replace`
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let _ = &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Finally mark this parent as the current revision
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        rev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; acc_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While recursion is natural to a recursive&#x2F;nested structure, also
consider an iterative approach which may be overall simpler and just
as efficient.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;rust-bit-folding-a-recursive-parser&#x2F;iterative.rs&quot;&gt;Iterative Source Code&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes&quot; aria-label=&quot;Anchor link for: notes&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;using-fold&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#using-fold&quot; aria-label=&quot;Anchor link for: using-fold&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Using fold&lt;&#x2F;h3&gt;
&lt;p&gt;Instead of a loop, it can be directly converted to a more succinct
fold with &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;nom&#x2F;5.1.1&#x2F;nom&#x2F;multi&#x2F;fn.fold%5Fmany0.html&quot;&gt;fold_many0&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;nom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;multi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fold_many0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Revision, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; suffix &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_caret&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parse_tilde&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Apply the `suffix` parser 0 or more times with the same logic
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;all_consuming&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fold_many0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;acc_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= match &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unreachable!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Parent&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ancestor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let _ = &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;boxed_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; acc_rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        rev
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}))(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The only caveat with this combinator alongside &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;nom&#x2F;5.1.1&#x2F;nom&#x2F;branch&#x2F;fn.alt.html&quot;&gt;alt&lt;&#x2F;a&gt; is that it clones
the input after each iteration which contradicts the original goal.
In practice this is not detrimental but do check and be aware if the
more complex function are bottlenecks. Rewriting them as a simpler
function always works if needed:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;nom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ErrorKind&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Instead of a parser combinator, it can be a sequence of if-let returns
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; A little more verbose but it avoids cloning the input
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;suffix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, Revision&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_caret&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse_tilde&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Construct nom error manually
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Err&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;nom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Err&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ErrorKind&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Alt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Not Tonight - Lacking Edge</title>
          <pubDate>Fri, 08 Jan 2021 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/not-tonight-lacking-edge/</link>
          <guid>https://fnlog.dev/gamer/not-tonight-lacking-edge/</guid>
          <description>&lt;h2 id=&quot;not-tonight&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#not-tonight&quot; aria-label=&quot;Anchor link for: not-tonight&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Not Tonight&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Finished main content on Switch&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;www.nottonightgame.com&#x2F;&quot;&gt;Not Tonight&lt;&#x2F;a&gt; is an error detection game playing as a discriminated
immigrant bouncer in a post-&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Brexit&quot;&gt;Brexit&lt;&#x2F;a&gt; scenario starting from checking for
fake identification cards to tickets, visas and credit score. While it
may sound mundane, it requires concentration, snap judgment,
confidence and intuition to survive which provides a form of
mechanical joy and flow. The game is played over three months each
with around 25 working days and finished within 10 hours.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#thoughts&quot; aria-label=&quot;Anchor link for: thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;My primary issue of the game is its lack of difficulty. Although
difficulty is subjective, the game does not push enough to force the
player to engage in corrupt activities such as drug dealing or
bribery. Specifically, venues offer double pay after finishing at
least thrice providing a wide safety margin despite being less
forgiving. Since the player is encouraged to repeat this in many
venues, the difficulty curve quickly becomes flat and money easy.
Keeping difficulty the same, the game should remove double pay and
lower the pay overall. The only interesting mechanical variation is
intentionally making mistakes for the resistance which provided
strategic and tactical depth that the game could use more. Perhaps a
venue or night fails if a certain number of people are allowed, a
rowdy person might clear a line or waste more time, a dependent you
need to take care of and so on. The game could use more flourish and
difficulty to further push its point. In the end, I was living
comfortably with ten thousand euros and fully upgraded house which
slightly ruined immersion.&lt;&#x2F;p&gt;
&lt;p&gt;Another issue is the story and pacing. Although the game provides
multiple venues with different condition sets to shake things up,
majority of the story objectives are to acquire venue specific items
by successfully finishing them thrice that feels draining and
repetitive. Those story rewards feel ambiguous and aimless yet the
optional objectives with its smaller character moments despite not
having tangible rewards feel like small personal victories which shows
the story missions can be better designed and written. The story is
framed around the opening incident that seems unnecessary and shown by
an discontinuous countdown and nothing conclusive or interesting
afterwards. If the story and pacing before and after the incident is
weak, perhaps the game should lean on smaller plots of hardship and
empathy instead of a hollow resistance plot.&lt;&#x2F;p&gt;
&lt;p&gt;Despite my issues and some other minor issues and bugs, I enjoyed the
game as it is but it fizzled out past the difficulty spikes. Whether
the writing or satire hits the mark, it sadly does not feel meaningful
to play but I do appreciate the exploration of being abandoned by the
country. I would like to see this genre flourish and perhaps not
necessarily in a dystopia.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Children of Morta Switch - A Subpar Experience</title>
          <pubDate>Wed, 30 Dec 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/children-of-morta-a-subpar-experience/</link>
          <guid>https://fnlog.dev/gamer/children-of-morta-a-subpar-experience/</guid>
          <description>&lt;h2 id=&quot;children-of-morta&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#children-of-morta&quot; aria-label=&quot;Anchor link for: children-of-morta&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Children of Morta&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Played with two players at Normal difficulty until Area 30 Boss on
Switch&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;childrenofmorta.com&#x2F;&quot;&gt;Children of Morta&lt;&#x2F;a&gt; is an pixel art &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Hack%5Fand%5Fslash&quot;&gt;hack and slash&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Dungeon%5Fcrawl&quot;&gt;dungeon crawler&lt;&#x2F;a&gt; with
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Roguelike&quot;&gt;rogue-lite&lt;&#x2F;a&gt; elements that tells the story of the &lt;a href=&quot;https:&#x2F;&#x2F;childrenofmorta.gamepedia.com&#x2F;Characters&quot;&gt;Bergsons&lt;&#x2F;a&gt; family
struggle and sacrifice against the &lt;a href=&quot;https:&#x2F;&#x2F;childrenofmorta.gamepedia.com&#x2F;Enemies&quot;&gt;corruption&lt;&#x2F;a&gt; of the mountain god.
While I appreciate not worrying about loot and builds, the overall
execution felt flat specially in the long term which made me drop the
game.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#thoughts&quot; aria-label=&quot;Anchor link for: thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;My biggest issue is that the game is mechanically shallow and flat.
While the skills and characters are functional and varied, it does not
offer modifiers to offer complexity or depth. Without any meaningful
options or choices, the roughly 3 active skills quickly become
repetitive and boring. Since the game has skill modifiers as item
pickups via &lt;a href=&quot;https:&#x2F;&#x2F;childrenofmorta.gamepedia.com&#x2F;Runes&quot;&gt;runes&lt;&#x2F;a&gt;, turning them into options with might be better.
Also turning one or both active items or &lt;a href=&quot;https:&#x2F;&#x2F;childrenofmorta.gamepedia.com&#x2F;Divine%5FRelics&quot;&gt;divine relics&lt;&#x2F;a&gt; slots into
active skills slots instead can increase depth. The skill progression
only offers one tree or build so making it available at the start and
provide a different form of progression such as new skill modifiers or
items. Simple combat is not necessarily bad but the other half of the
equation is not good as well: enemies.&lt;&#x2F;p&gt;
&lt;p&gt;As primarily a ranged player, combat primarily involves pulling the
enemies and slowly trimming the herd while deftly dodging attacks.
While this playstyle is not bad, the enemy variety and complexity does
not meaningfully challenge this model that it contributes to the
boredom. Likewise, the generated levels themselves are frequently long
hallways that do not offer much in tactics, strategy or positioning.
Lastly, the dungeon bosses are decent but not challenging or
memorable. Alongside the lack of skill complexity, these factors make
dungeon crawling not as enjoyable.&lt;&#x2F;p&gt;
&lt;p&gt;Since mechanical depth and enemy combat are flat, skill becomes less
important while statistic more so. Even if I prefer skill be rewarded
more than time, the game&#x27;s execution on both is underwhelming. While I
do have minor issues with the narration, audio and presentation, I
still respect the game&#x27;s attempt and would like to see a more polished
sequel.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Katawa Shoujo - A Visual Novel Gem</title>
          <pubDate>Tue, 29 Dec 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/katawa-shoujo-a-visual-novel-gem/</link>
          <guid>https://fnlog.dev/gamer/katawa-shoujo-a-visual-novel-gem/</guid>
          <description>&lt;h2 id=&quot;katawa-shoujo&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#katawa-shoujo&quot; aria-label=&quot;Anchor link for: katawa-shoujo&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Katawa Shoujo&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Finished every route with a good ending on PC&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.katawa-shoujo.com&#x2F;about.php&quot;&gt;Katawa Shoujo&lt;&#x2F;a&gt; is a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Bish%C5%8Djo%5Fgame&quot;&gt;bishoujo&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Dating%5Fsim&quot;&gt;dating simulator&lt;&#x2F;a&gt; visual novel game
where typically an attractive boy (the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Player%5Fcharacter&quot;&gt;player character)&lt;&#x2F;a&gt; interacting
with several girls and ultimately be in a relationship with one of
them. The twist is that these girls (and main character) are &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Disability&quot;&gt;disabled&lt;&#x2F;a&gt;
that makes the player rethink their involvement or commitment.
Thankfully, the writing does not use &lt;em&gt;disability&lt;&#x2F;em&gt; as a shield or ploy
and uses it to foster understanding and equality. The game can be
downloaded for free and consists of 5 routes each with 4 chapters
which took roughly 1 hour each or around 20 hours in total.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#thoughts&quot; aria-label=&quot;Anchor link for: thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;Since this is my first foray into visual novels, I can only
meaningfully judge the experience, so the quality of graphics, design
and options are beyond me. As a &lt;em&gt;dating simulator&lt;&#x2F;em&gt;, judging the routes
is quite subjective and personal as people have their own priorities
and experiences; my criteria is not character development, romantic
compatibility or character personality but the writing, experience and
impact. Among the possible routes, &lt;a href=&quot;https:&#x2F;&#x2F;katawashoujo.fandom.com&#x2F;wiki&#x2F;Rin%5FTezuka&quot;&gt;Rin&#x27;s route&lt;&#x2F;a&gt; is the best written in
showing the effort, anxiety and uncertainty of falling in love with
her because of her communication issues and not her limbs. &lt;a href=&quot;https:&#x2F;&#x2F;katawashoujo.fandom.com&#x2F;wiki&#x2F;Hanako%27s%5Froute&quot;&gt;Hanako&#x27;s
route&lt;&#x2F;a&gt; tackles &lt;em&gt;disability&lt;&#x2F;em&gt; the best since it requires perceiving her
past her trauma and appearance much more so than &lt;a href=&quot;https:&#x2F;&#x2F;katawashoujo.fandom.com&#x2F;wiki&#x2F;Emi%5FIbarazaki&quot;&gt;Emi&#x27;s route&lt;&#x2F;a&gt;. Sadly,
&lt;a href=&quot;https:&#x2F;&#x2F;katawashoujo.fandom.com&#x2F;wiki&#x2F;Lilly%5FSatou&quot;&gt;Lily&#x27;s route&lt;&#x2F;a&gt; has little tension and &lt;a href=&quot;https:&#x2F;&#x2F;katawashoujo.fandom.com&#x2F;wiki&#x2F;Shizune%5FHakamichi&quot;&gt;Shizune&#x27;s route&lt;&#x2F;a&gt; has pacing issues.
Nonetheless, the routes are good overall and show people are not
defined by their disability but are people still.&lt;&#x2F;p&gt;
&lt;p&gt;For the expected sex scenes, I can only judge them for their impact
and weight. I like &lt;em&gt;Rin&lt;&#x2F;em&gt;&#x27;s and &lt;em&gt;Hanako&lt;&#x2F;em&gt;&#x27;s scenes since both
meaningfully progress the relationship; however, the scenes of the
other characters are less interesting because it happens multiple
times and of libido. Personally, this aspect of &lt;em&gt;dating simulators&lt;&#x2F;em&gt; is
hard to discuss but perhaps I wanted this to be handled more maturely
since it tackles &lt;em&gt;disability&lt;&#x2F;em&gt;. This is not a big issue since
objectification and intimacy requires empathy by virtue of the whole
cast having &lt;em&gt;disabilities&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;My only true criticism of the game is &lt;a href=&quot;https:&#x2F;&#x2F;katawashoujo.fandom.com&#x2F;wiki&#x2F;Kenji%5FSetou&quot;&gt;Kenji&lt;&#x2F;a&gt; who does not contribute
much to the story or any route and should be removed or replaced to
improve overall pacing. I would also appreciate more dialogue choices
(not necessarily branches) to increase interactivity and provide
breaks from lengthy text sequences. Other than that, this visual novel
is a rare gem and worth your attention.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>No More Heroes 1 And 2 - A Good And Bad Game</title>
          <pubDate>Thu, 03 Dec 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/no-more-heroes-1-and-2-a-good-and-bad-game/</link>
          <guid>https://fnlog.dev/gamer/no-more-heroes-1-and-2-a-good-and-bad-game/</guid>
          <description>&lt;h2 id=&quot;no-more-heroes-1-and-2&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#no-more-heroes-1-and-2&quot; aria-label=&quot;Anchor link for: no-more-heroes-1-and-2&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
No More Heroes 1 &amp;amp; 2&lt;&#x2F;h2&gt;
&lt;p&gt;I have heard about this series but have not played any of it. I did
enjoy the writing and story of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Travis%5FStrikes%5FAgain:%5FNo%5FMore%5FHeroes&quot;&gt;Travis Strikes Again: No More Heroes&lt;&#x2F;a&gt;
and with the highly anticipated &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;No%5FMore%5FHeroes%5FIII&quot;&gt;No More Heroes 3&lt;&#x2F;a&gt;, I needed to play the
games in the series before then. Overall, the first game was good but
the second game was bad even without continuity. Either way, I do hope
they take all this experience as I want to experience this universe.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-good-game&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#a-good-game&quot; aria-label=&quot;Anchor link for: a-good-game&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
A Good Game&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Finished at Normal&#x2F;Mild difficulty on Switch&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;No%5FMore%5FHeroes%5F(video%5Fgame)&quot;&gt;No More Heroes 1&lt;&#x2F;a&gt; is a charming game despite its lack of quality. Boss
characters&#x2F;fights are intriguing with their atmosphere and writing.
Those are paced by the the city sandbox with its mundane jobs&#x2F;mini
games and assassination gigs&#x2F;side missions all adding to the overall
charm and aesthetic as well despite the repetitive travel. The combat
system is just right with its movement and feel and the bosses are
balanced nicely with it providing a good challenge. Aside from the
interesting main character and story subversion, everything added up
to make this a game worth playing.&lt;&#x2F;p&gt;
&lt;p&gt;My only hope for the sequel is to expand the combat system, provide
quality of life options for the sandbox and overall polish. Sadly,
this would not be the case.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-bad-game&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#a-bad-game&quot; aria-label=&quot;Anchor link for: a-bad-game&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
A Bad Game&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Finished at Normal&#x2F;Mild difficulty on Switch&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;After finishing the first game and a rest day, the sequel &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;No%5FMore%5FHeroes%5F2:%5FDesperate%5FStruggle&quot;&gt;No More
Heroes 2: A Desperate Struggle&lt;&#x2F;a&gt; feels bad to play even without knowing
the prequel. The worst issue is that the bosses are far more broken
with stun locks specially the last boss and easier to exploit with the
more fluid character movements which makes them less enjoyable as a
whole. Levels are primarily room after room mob spawns which makes
them less interesting. Enemy variety is lacking and their higher
health makes the fight more drawn out. Lastly is &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Strafing%5F(video%5Fgames)&quot;&gt;strafing&lt;&#x2F;a&gt; where it
feels like the camera is only locked and the character still moves as
if it was not which is disorienting since many of the fights are
duels. Although more characters and weapons have been introduced, the
new changes made the combat system clunkier and worse.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of an city sandbox, a stage&#x2F;mission select replaced it. While
the travel was repetitive, I did not want it removed since it adds to
the charm where both could have coexisted as quality of life. While
the side jobs are a mixed bag, the kill side missions&#x2F;gigs are
repetitive simply being kill one or all types and made worse from the
combat system. This makes the game seems to have less content or
weight from a surface level.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from the game breaking continuity, the game&#x27;s character writing
and story is lacking. Primarily, the bosses lost their strong
introductions and meaningful banter which I craved for in between
ranking fights. While the 50 person ranking system may be intended as
a facade with multiple jumps and illogical rules, the title has less
weight or impact. Subverting the revenge story is a good idea but its
execution was lacking with its lackluster experience. Much of the
charm and appeal of the first game is lost from the writing alone.&lt;&#x2F;p&gt;
&lt;p&gt;While I have other grievances, the sequel was bad even though it felt
more fluid or expanded. If they added more quality of life changes
from the previous, it would make this game possibly better to play
even if the story was not. Taking continuity into account makes it
worse as the character development and hanging question were
disregarded for this disappointing setup.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Rit Journal - Diff Command</title>
          <pubDate>Tue, 01 Dec 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev_journal/rit-journal-diff-command/</link>
          <guid>https://fnlog.dev/dev_journal/rit-journal-diff-command/</guid>
          <description>&lt;h2 id=&quot;chapter-12-diff-command&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#chapter-12-diff-command&quot; aria-label=&quot;Anchor link for: chapter-12-diff-command&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Chapter 12: Diff Command&lt;&#x2F;h2&gt;
&lt;p&gt;This chapter is about integrating the &lt;code&gt;myers::diff&lt;&#x2F;code&gt; by making the &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-diff&quot;&gt;diff&lt;&#x2F;a&gt;
command. Writing the new command is straightforward but hunking the
diffs and integrating a pager was challenging specially to optimize.&lt;&#x2F;p&gt;
&lt;p&gt;Source:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev_journal&#x2F;rit-journal-diff-command&#x2F;core_diff.rs&quot;&gt;core&#x2F;diff.rs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev_journal&#x2F;rit-journal-diff-command&#x2F;cli_diff.rs&quot;&gt;cli&#x2F;diff.rs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev_journal&#x2F;rit-journal-diff-command&#x2F;pager.rs&quot;&gt;pager.s&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;abstracting-commands&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#abstracting-commands&quot; aria-label=&quot;Anchor link for: abstracting-commands&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Abstracting Commands&lt;&#x2F;h3&gt;
&lt;p&gt;Since the &lt;code&gt;diff&lt;&#x2F;code&gt; and &lt;code&gt;status&lt;&#x2F;code&gt; command render the same data
differently, the book suggests to refactor them into an abstract base
class. While &lt;em&gt;Rust&lt;&#x2F;em&gt; does not have abstract classes, I used &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch14-03-cargo-workspaces.html&quot;&gt;cargo
workspaces&lt;&#x2F;a&gt; to share the core library crate and reuse them in the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Command-line%5Finterface&quot;&gt;CLI&lt;&#x2F;a&gt;
binary crate which is the same effect. Even in &lt;a href=&quot;https:&#x2F;&#x2F;elixir-lang.org&#x2F;getting-started&#x2F;mix-otp&#x2F;dependencies-and-umbrella-projects.html&quot;&gt;Elixir,&lt;&#x2F;a&gt; I usually
structure my applications like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;workspace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;members &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= [
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;core&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;cli&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This separation allows me to test easier with modular interfaces or
layers. Also if more interfaces are needed such as a GUI or C
library, it is easy to plug it in. It also helps with compilation
time since modified crates should only be compiled. Not necessarily
an abstract classes equivalent but I appreciate how workspaces made
this natural.&lt;&#x2F;p&gt;
&lt;p&gt;Personally, I prefer traits or object composition over abstract
classes since they are safer and easier to maintain. One difficulty
with abstract classes is that when it is changed, its concrete
classes also change which may lead to incorrect or undefined
behavior. Another is allowing object hierarchy that increase learning
complexity than multiple smaller traits. The closest thing in &lt;em&gt;Rust&lt;&#x2F;em&gt;
is that trait methods can have default implementation which I did for
&lt;code&gt;Blob&lt;&#x2F;code&gt;, &lt;code&gt;Tree&lt;&#x2F;code&gt; and &lt;code&gt;Commit&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Trait to serialize&#x2F;deserialize to the correct git storage formats
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub trait &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ObjectData &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;kind&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;static str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;object_content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; content &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buf &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;format!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{} {}&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;kind&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        buf
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ObjectData &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Blob &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;kind&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;static str &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;blob&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Import the trait to use its methods
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;core&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ObjectData&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; blob &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Blob&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;blob&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;object_content&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Implementing the required trait methods and having the optional
methods be interface methods feel better. &lt;em&gt;Rust&lt;&#x2F;em&gt; also has &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;rust-by-example&#x2F;trait&#x2F;supertraits.html&quot;&gt;supertraits&lt;&#x2F;a&gt;
which is the closest to inheritance but not needed here. Perhaps
abstract classes are in conflict with &lt;em&gt;Rust&lt;&#x2F;em&gt;&#x27;s zero-cost abstraction?
Either way, it is a minor thing but I do appreciate &lt;em&gt;Rust&lt;&#x2F;em&gt; more on
this front.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hunks&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#hunks&quot; aria-label=&quot;Anchor link for: hunks&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Hunks&lt;&#x2F;h3&gt;
&lt;p&gt;The hardest task is to filter and group a list of diffs to highlight
the changes. Ideally, it looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Hunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Hunk &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diff_hunks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Hunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unimplemented!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_lines &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_lines &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diffs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hunk &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Hunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diff_hunks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;info!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;{}{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;@@ -9,7 +9,7 @@
&lt;&#x2F;span&gt;&lt;span&gt; const PAGER_CMD: &amp;amp;&amp;#39;static str = &amp;quot;less&amp;quot;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt; pub struct Pager {
&lt;&#x2F;span&gt;&lt;span&gt;-    cmd: String,
&lt;&#x2F;span&gt;&lt;span&gt;+    cmd: Option&amp;lt;String&amp;gt;,
&lt;&#x2F;span&gt;&lt;span&gt; }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt; impl Pager {
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The challenge comes from grouping the diffs into hunks. Initially, I
thought to &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;itertools&#x2F;0.9.0&#x2F;itertools&#x2F;trait.Itertools.html#method.group%5Fby&quot;&gt;group by&lt;&#x2F;a&gt; the diffs into a change and non-change group,
filter out the non-change groups and store everything into a vector:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;itertools&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Itertools&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hunks &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group_by&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;is_same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;_group&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The tricky thing is that hunks have leading and trailing padding
diffs (3 &lt;code&gt;Diff::Same&lt;&#x2F;code&gt; above and below) to further show where the
hunks are. Furthermore, when two hunks are separated by less than the
padding amount, they are merged together. The following snippet is my
version of the chunking algorithm:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group_hunks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;b Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;is_change&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; impl Fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;padding&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;b &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hunks &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; offset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;loop &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; First Phase: Find the first&#x2F;next element that is a change
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;offset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_change&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            offset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; offset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Second Phase: Find the end of the hunk with padding
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; The start of the hunk is the current minus the padding
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hunk_start &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; offset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checked_sub&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;padding&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap_or_default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; This variables will end at the end of the hunk
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; counter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; padding&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        offset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; counter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; offset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;offset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; If the current diff is a change, refresh the counter.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Otherwise, decrement it.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_change&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                counter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; padding&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                counter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            offset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; With start and end index, the hunk can be added
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        hunks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hunk_start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;offset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        offset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    hunks
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff_slice &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group_hunks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hunk &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Hunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diff_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hunk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;info!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;{}{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I am proud of this since it only needs to allocate for the new list
compared to the book which makes me appreciate how &lt;em&gt;Rust&lt;&#x2F;em&gt; encourages
optimization because of its type system.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pager&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pager&quot; aria-label=&quot;Anchor link for: pager&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Pager&lt;&#x2F;h3&gt;
&lt;p&gt;Since the output of this command is quite long, the book suggests
integrating a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Terminal%5Fpager&quot;&gt;terminal pager&lt;&#x2F;a&gt; which allows the output to be scrolled
via &lt;a href=&quot;http:&#x2F;&#x2F;www.greenwoodsoftware.com&#x2F;less&#x2F;&quot;&gt;less&lt;&#x2F;a&gt; or some other pager command. The main idea is to spawn a
process via &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;process&#x2F;struct.Command.html#method.spawn&quot;&gt;std::process::Command::spawn&lt;&#x2F;a&gt; and pipe the output of the
command to the input of this child process instead:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Command&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Stdio&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pager_child &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Command&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;less&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;LESS&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;FRV&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Add default LESS options
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Stdio&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;piped&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Enable child stdin
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stdout&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Stdio&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inherit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Share parent stdout to child
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Pager spawn failed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; output &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;HELLO WORLD&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; stdin &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pager_child&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write_all&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Failed to write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flush&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Failed to flush&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Instead of just println!(output) or info!(output);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pager_child&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wait&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Failed to close&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Wait for the subprocess to close
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although &lt;em&gt;Rust&lt;&#x2F;em&gt; has the &lt;code&gt;Drop&lt;&#x2F;code&gt; trait, it is not implemented for &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;process&#x2F;struct.Child.html#warning&quot;&gt;Child&lt;&#x2F;a&gt;
so &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;process&#x2F;struct.Child.html#method.wait&quot;&gt;Child::wait&lt;&#x2F;a&gt; is required at the ends of its lifetime to avoid
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Zombie%5Fprocess&quot;&gt;zombie processes&lt;&#x2F;a&gt;. Since I use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;log&quot;&gt;log&lt;&#x2F;a&gt; (and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;clux&#x2F;loggerv&quot;&gt;loggerv&lt;&#x2F;a&gt;), the challenge comes
from redirecting the output to this child&#x27;s &lt;code&gt;stdin&lt;&#x2F;code&gt;. Instead of
replacing every instance of &lt;code&gt;info!&lt;&#x2F;code&gt; in this command, I can create a
custom &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;log&#x2F;0.4.11&#x2F;log&#x2F;#implementing-a-logger&quot;&gt;Log&lt;&#x2F;a&gt; to redirect the output instead:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; LevelFilter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Metadata&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Child&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;sync&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Arc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Mutex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Arc + Mutex since static lifetime and interior mutability is needed
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setup_piped_logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;child_rc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Arc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Mutex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Child&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ChildLog&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Arc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Mutex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Child&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Custom logger redirecting to child process
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Log &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ChildLog &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;enabled&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;_metadata&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Metadata&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; child &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Process failed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; stdin &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;child&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Process failed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            stdin
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write_fmt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;record&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Failed to write to stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            stdin
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Failed to write to stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flush&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; child &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Process failed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; stdin &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;child&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Process failed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flush&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Failed to write to stdin&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Set custom logger
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set_max_level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;LevelFilter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set_boxed_logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ChildLog&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;child_rc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pager_rc &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Arc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Mutex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pager_child&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setup_piped_logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pager_rc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Goes through the pager instead of the console directly
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;info!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;LET THERE BE LIGHT&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pager_rc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wait&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Failed to close&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;My only peeve is using &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;sync&#x2F;struct.Arc.html&quot;&gt;Arc&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;sync&#x2F;struct.Mutex.html&quot;&gt;Mutex&lt;&#x2F;a&gt; to get around the static
lifetime of the boxed logger. I could use &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;reference&#x2F;items&#x2F;static-items.html&quot;&gt;mutable static&lt;&#x2F;a&gt; but it
requires unsafe which is not allowed or needed. I am impressed that
writing a custom logger was straightforward for a pager view.
Tutorials for integrating a more thorough pager was sparse and
perhaps an area to write about.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Elixir Bit - socket.io Client Websocket</title>
          <pubDate>Sun, 22 Nov 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/elixir-bit-socket-io-client-websocket/</link>
          <guid>https://fnlog.dev/wanderer/elixir-bit-socket-io-client-websocket/</guid>
          <description>&lt;h2 id=&quot;introspection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#introspection&quot; aria-label=&quot;Anchor link for: introspection&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Introspection&lt;&#x2F;h2&gt;
&lt;p&gt;I need an Elixir client for &lt;a href=&quot;https:&#x2F;&#x2F;vcc.exchange&#x2F;api&#x2F;#trades-created&quot;&gt;VccExchange&lt;&#x2F;a&gt;, a cryptocurrency trading
platform, to place orders and track trades. The REST client uses &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;CURL&quot;&gt;cURL&lt;&#x2F;a&gt;
so porting it via &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;teamon&#x2F;tesla&quot;&gt;tesla&lt;&#x2F;a&gt; is straightforward; however, the websocket
uses &lt;a href=&quot;https:&#x2F;&#x2F;socket.io&#x2F;&quot;&gt;socket.io&lt;&#x2F;a&gt; which requires a specific protocol or library. Although
&lt;em&gt;socket.io&lt;&#x2F;em&gt; clients are implemented in &lt;a href=&quot;https:&#x2F;&#x2F;socket.io&#x2F;docs&#x2F;v3&#x2F;&quot;&gt;several languages&lt;&#x2F;a&gt;, &lt;em&gt;Elixir&lt;&#x2F;em&gt;
sadly does not have one. While it might be worth making a client as a
project, I only needed to subscribe to specific events specifically
&lt;a href=&quot;https:&#x2F;&#x2F;vcc.exchange&#x2F;api&#x2F;#balance-updated&quot;&gt;balance changes&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;vcc.exchange&#x2F;api&#x2F;#trades-created&quot;&gt;trades executed&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Source: &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;elixir-bit-socket-io-client-websocket&#x2F;socket.ex&quot;&gt;socket.ex&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;websockex&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#websockex&quot; aria-label=&quot;Anchor link for: websockex&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
websockex&lt;&#x2F;h2&gt;
&lt;p&gt;When I was working on a similar case with &lt;a href=&quot;https:&#x2F;&#x2F;docs.bitfinex.com&#x2F;docs&#x2F;ws-auth&quot;&gt;Bitfinex&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Azolo&#x2F;websockex&quot;&gt;websockex&lt;&#x2F;a&gt; is a
good websocket library that feels like a normal &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;elixir&#x2F;Kernel.html&quot;&gt;GenServer&lt;&#x2F;a&gt; that the
following snippet shows:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;App&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Socket &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;require &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Logger
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;WebSockex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Taken from inspecting the dashboard with the browser&amp;#39;s native debugger
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;websocket_url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;wss:&#x2F;&#x2F;socket.vcc.exchange:6001&#x2F;socket.io&#x2F;?EIO=3&amp;amp;transport=websocket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start_link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    state &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;WebSockex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start_link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;websocket_url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    # TODO: Subscribe to events
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_connect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Socket Connected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_disconnect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;disconnection&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Socket Disconnected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;({&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; msg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Message Received: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inspect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;msg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)}&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_cast&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;({:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, {&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; msg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Message Sent: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inspect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;msg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)}&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;reply&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;App&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Application &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Supervisor
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start_link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Supervisor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start_link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_init_arg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    children &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;App&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Socket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, []}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Supervisor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;children&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;strategy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;one_for_one&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running this via &lt;code&gt;App.Socket.start_link(nil)&lt;&#x2F;code&gt; or &lt;code&gt;iex -S mix&lt;&#x2F;code&gt; connects
properly to the server. Now how to subscribe to the channels&#x2F;events?
In particular, this snippet from the &lt;a href=&quot;https:&#x2F;&#x2F;vcc.exchange&#x2F;api&#x2F;#join-channel&quot;&gt;official documentation&lt;&#x2F;a&gt; needs to
be emulated:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;javascript&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-javascript &quot;&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;io &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;socket.io-client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;socket &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;io(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;wss:&#x2F;&#x2F;socket.vcc.exchange:6001&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;API_KEY &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;CHANNEL &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;private-App.User.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;EVENT &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;App&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Events&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;BalanceUpdated&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;socket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;disconnect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    console&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;disconnected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;socket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;reconnect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    console&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;reconnect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;socket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;reconnect_error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    console&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;reconnect error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;socket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;connect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    console&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;connected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    socket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emit(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;, {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;CHANNEL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        auth&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: {&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Authorization&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;: `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Bearer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;API_KEY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}`}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on(EVENT&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        console&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log(data)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since &lt;code&gt;websocketex&lt;&#x2F;code&gt; handles majority of the event handlers, only
&lt;a href=&quot;https:&#x2F;&#x2F;socket.io&#x2F;docs&#x2F;v3&#x2F;emitting-events&#x2F;&quot;&gt;socket.emit&lt;&#x2F;a&gt; needs to be handled. Looking at the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;socketio&#x2F;socket.io-protocol#difference-between-v3-and-v2&quot;&gt;socket.io protocol&lt;&#x2F;a&gt;,
the next snippet shows how it encodes the parameters:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;header &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;42&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spec emit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;charlist&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; any&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :: charlist
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;event_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  body &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;event_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;#{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Jason&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;encode!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)}&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hey&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;jude&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;42[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hey&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;jude&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MYCHANNEL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;42[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;,{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MYCHANNEL&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;}]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While this is no the full spec, it is enough to send over the wire.
So after the socket connects, I send the subscription event for each
channel:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start_link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;WebSockex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start_link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;websocket_url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  auth &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Authorization&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Bearer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;api_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()}&amp;quot;}}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;App.Trades.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()}&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;private-App.User.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;user_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()}&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;each&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; channel &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    frame &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; emit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;auth&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; auth&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;WebSockex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send_frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ETHBTC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;user_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;VCCE_USER_ID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;123456&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;api_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;VCCE_API_KEY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;CREATE_YOUR_OWN_KEY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The socket now receives changes in balance and new trades but they
still need to be handled.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;event-handling&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#event-handling&quot; aria-label=&quot;Anchor link for: event-handling&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Event Handling&lt;&#x2F;h2&gt;
&lt;p&gt;Received frames are handled in &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;websockex&#x2F;WebSockex.html#c:handle%5Fframe&#x2F;2&quot;&gt;Websockex.handle_frame&#x2F;2&lt;&#x2F;a&gt;. Let us examine
the balance update event.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;42&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;App&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Events&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;BalanceUpdated&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;private-App.User.123456&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;eth&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;balance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;10.000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;available_balance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;9.000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;socket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;null
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Almost JSON, the frame is wrapped by the &lt;code&gt;socket.io&lt;&#x2F;code&gt; protocol which we
can pattern match over after decoding it for ease:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;({:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;42&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; msg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;case &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Jason&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;decode!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;msg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;App&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Events&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;BalanceUpdated&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;private-App.User.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _user_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;socket&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;BalanceUpdated&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Logger&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;warn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Unhandled Message: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inspect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)}&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So in handling more events, the pattern can be augmented and a side
effect can be triggered. However, the &lt;code&gt;socket.io&lt;&#x2F;code&gt; events still need to
be handled. When the socket connects to server, the socket receives
the following frame:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;sid&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;SESSION_ID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;upgrades&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: [],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;pingInterval&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;25000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;pingTimeout&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5000
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The first frame sent by &lt;code&gt;socket.io&lt;&#x2F;code&gt; is the session information. The
important fields are the &lt;code&gt;pingInterval&lt;&#x2F;code&gt; and &lt;code&gt;pingTimeout&lt;&#x2F;code&gt; which
indicate a heartbeat in milliseconds. If you leave the socket open
around that time, it will disconnect and attempt to reconnect. The
quick solution is to use &lt;a href=&quot;https:&#x2F;&#x2F;erlang.org&#x2F;doc&#x2F;man&#x2F;timer.html#send%5Finterval-3&quot;&gt;:timer.send_interval&#x2F;3&lt;&#x2F;a&gt; and send a ping frame
which is &lt;code&gt;&amp;quot;2&amp;quot;&lt;&#x2F;code&gt; in &lt;code&gt;socket.io&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;heartbeat_interval &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5_000
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start_link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;timer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send_interval&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;heartbeat_interval &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ping&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ping&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;reply&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, {:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;({:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _session_frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;({:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from handling the &lt;code&gt;pong&lt;&#x2F;code&gt; response (&lt;code&gt;&amp;quot;3&amp;quot;&lt;&#x2F;code&gt;), the last one to
handle is joining a channel which is easily:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;({:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;40&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The socket is now stable and working more or less.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;It would be nice if an official &lt;code&gt;socket.io&lt;&#x2F;code&gt; client existed to make
this all easier and comprehensive. In particular, error handling and
testing is not ergonomic or apparent. Perhaps exposing a framework
agnostic websocket might alleviate library concerns but support
ultimately matters. Also, I realized that I could just introspect the
websocket messages in the browser and reference that instead of
guessing exact message which would have saved me hours.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Elixir Bit - Caching Docker Dependencies</title>
          <pubDate>Sun, 15 Nov 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/elixir-bit-caching-docker-dependencies/</link>
          <guid>https://fnlog.dev/wanderer/elixir-bit-caching-docker-dependencies/</guid>
          <description>&lt;h2 id=&quot;introspection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#introspection&quot; aria-label=&quot;Anchor link for: introspection&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Introspection&lt;&#x2F;h2&gt;
&lt;p&gt;Using &lt;a href=&quot;https:&#x2F;&#x2F;www.docker.com&#x2F;&quot;&gt;docker&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;docs.docker.com&#x2F;compose&#x2F;&quot;&gt;docker-compose&lt;&#x2F;a&gt; to share a packaged development
version of an &lt;em&gt;Elixir&lt;&#x2F;em&gt; application in a team was successful. My
&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;elixir-bit-caching-docker-dependencies&#x2F;Dockerfile.base&quot;&gt;Dockerfile&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;elixir-bit-caching-docker-dependencies&#x2F;docker-compose.base.yml&quot;&gt;docker-compose.yml&lt;&#x2F;a&gt; is straightforward although could be
further optimized:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;dockerfile&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-dockerfile &quot;&gt;&lt;code class=&quot;language-dockerfile&quot; data-lang=&quot;dockerfile&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; elixir:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;1.9.0-alpine
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apk --no-cache --update add \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        git \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        erlang \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        alpine-sdk \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        gmp-dev \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        automake \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        libtool \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        inotify-tools \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        autoconf
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ENV &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;HOME=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;opt&#x2F;elixir&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    MIX_HOME=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;opt&#x2F;elixir&#x2F;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    MIX_BUILD_PATH=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;opt&#x2F;elixir&#x2F;build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    HEX_HOME=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;opt&#x2F;elixir&#x2F;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    PATH=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;$PATH:&#x2F;opt&#x2F;elixir&#x2F;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    ERL_AFLAGS=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-kernel shell_history enabled&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    ELIXIR_ERL_OPTS=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;+C multi_time_warp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mkdir -p &#x2F;opt&#x2F;elixir&#x2F;hex &amp;amp;&amp;amp; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    mkdir -p &#x2F;opt&#x2F;elixir&#x2F;mix &amp;amp;&amp;amp; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    mkdir -p &#x2F;opt&#x2F;elixir&#x2F;build &amp;amp;&amp;amp; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    mkdir -p &#x2F;opt&#x2F;elixir&#x2F;.cache
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mkdir -p &#x2F;opt&#x2F;app &amp;amp;&amp;amp; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    mkdir -p &#x2F;opt&#x2F;app&#x2F;deps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chmod -R 777 &#x2F;opt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mix local.hex --force &amp;amp;&amp;amp; mix local.rebar --force
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;WORKDIR &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&#x2F;opt&#x2F;app
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;EXPOSE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;4000
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;CMD &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--no-halt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For my development &lt;code&gt;Dockerfile&lt;&#x2F;code&gt;, I use an &lt;a href=&quot;https:&#x2F;&#x2F;hub.docker.com&#x2F;%5F&#x2F;elixir&#x2F;&quot;&gt;alpine Elixir image&lt;&#x2F;a&gt; to
minimize the download size and handpick a few packages to build
dependencies. I place everything related to &lt;em&gt;Elixir&lt;&#x2F;em&gt; in &lt;code&gt;&#x2F;opt&#x2F;elixir&lt;&#x2F;code&gt;
so that it can be cached via a &lt;a href=&quot;https:&#x2F;&#x2F;docs.docker.com&#x2F;storage&#x2F;volumes&#x2F;&quot;&gt;docker volume&lt;&#x2F;a&gt; and mount the project in
&lt;code&gt;&#x2F;opt&#x2F;app&lt;&#x2F;code&gt;. I also prepare the &lt;code&gt;deps&lt;&#x2F;code&gt; folder to be locally cached
which the &lt;code&gt;docker-compose.yml&lt;&#x2F;code&gt; can illustrate:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;3.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;services&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;postgres:9.5.17-alpine
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;restart&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;always
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: .
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dockerfile&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Dockerfile
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix phx.server&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;entrypoint&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;opt&#x2F;app&#x2F;docker-entrypoint.sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.:&#x2F;opt&#x2F;app
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elixir:&#x2F;opt&#x2F;elixir
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mix_deps:&#x2F;opt&#x2F;app&#x2F;deps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;depends_on&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;db
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;links&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;db:db
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;elixir&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;mix_deps&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This setup works usually for an &lt;a href=&quot;https:&#x2F;&#x2F;www.phoenixframework.org&#x2F;&quot;&gt;phoenix umbrella application&lt;&#x2F;a&gt; that
requires a &lt;a href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;&quot;&gt;postgresql&lt;&#x2F;a&gt; database. When the container runs, I have it
fetch dependencies and migrations via &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;elixir-bit-caching-docker-dependencies&#x2F;docker-entrypoint.sh&quot;&gt;docker-entrypoint.sh&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;set -e
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;echo &amp;quot;Updating dependencies if any uninstalled packages...&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;HEX_HTTP_CONCURRENCY=1 HEX_HTTP_TIMEOUT=1200 mix deps.get
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;echo &amp;quot;Running migrations if any...&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;mix do ecto.create --no-deps-check, ecto.migrate --no-deps-check
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;echo &amp;quot;Done with housecleaning&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;exec &amp;quot;$@&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running it is direct although with a minor &lt;code&gt;chmod&lt;&#x2F;code&gt; on &lt;code&gt;mix.lock&lt;&#x2F;code&gt; since
&lt;code&gt;mix.lock&lt;&#x2F;code&gt; is updated in the container:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;git pull
&lt;&#x2F;span&gt;&lt;span&gt;git checkout feature&#x2F;branch
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;docker-compose build
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;sudo chmod 777 mix.lock
&lt;&#x2F;span&gt;&lt;span&gt;docker-compose up
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For the most part, it works without issue; surprisingly, the most
frequent issue is that &lt;a href=&quot;https:&#x2F;&#x2F;hex.pm&#x2F;&quot;&gt;hex.pm&lt;&#x2F;a&gt; fails to fetch dependencies when
rebuilding. Even with a good connection, I do run into the issue
occasionally with minor annoyance. With poorer connection quality, it
becomes a blocker. To mitigate this, is it possible to download all
the dependencies locally and use that instead?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;local-mirror&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#local-mirror&quot; aria-label=&quot;Anchor link for: local-mirror&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Local Mirror&lt;&#x2F;h2&gt;
&lt;p&gt;In finding a solution, I came across&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wojtekmach&#x2F;mini%5Frepo&quot;&gt; mini_repo&lt;&#x2F;a&gt;, a minimal &lt;em&gt;hex.pm&lt;&#x2F;em&gt;
server that can mirror and serve a few remote dependencies. Sadly, it
is bare, so I &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;mini%5Frepo&quot;&gt;forked&lt;&#x2F;a&gt; it to demonstrate how I tweaked it for &lt;em&gt;docker&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Running it by default, it only mirrors &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ericmj&#x2F;decimal&quot;&gt;decimal&lt;&#x2F;a&gt;. To make it
configurable in &lt;em&gt;docker-compose&lt;&#x2F;em&gt;, I added an space-delimited
&lt;code&gt;PACKAGES&lt;&#x2F;code&gt; environment variable:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;services&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;enviroment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;PACKAGES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;-
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        decimal
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        phoenix
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# config&#x2F;dev.exs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;packages &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PACKAGES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot; &amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mini_repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;repositories&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hexpm_mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      # only: ~w(decimal)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; packages&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# Does not fetch any package
&lt;&#x2F;span&gt;&lt;span&gt;mix run --no-halt
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Fetch one package
&lt;&#x2F;span&gt;&lt;span&gt;PACKAGES=&amp;quot;decimal&amp;quot; mix run --no-halt
&lt;&#x2F;span&gt;&lt;span&gt;HEX_MIRROR=http:&#x2F;&#x2F;localhost:4000&#x2F;repos&#x2F;hexpm_mirror mix hex.package fetch decimal 1.8.0
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Fetch multiple packages
&lt;&#x2F;span&gt;&lt;span&gt;export HEX_MIRROR=http:&#x2F;&#x2F;localhost:4000&#x2F;repos&#x2F;hexpm_mirror
&lt;&#x2F;span&gt;&lt;span&gt;PACKAGES=&amp;quot;decimal phoenix&amp;quot; mix run --no-halt
&lt;&#x2F;span&gt;&lt;span&gt;mix hex.package fetch phoenix 1.5.6
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;em&gt;mini_repo&lt;&#x2F;em&gt; logs are promising:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;17:17:21.433 [info]  GET &#x2F;repos&#x2F;hexpm_mirror&#x2F;packages&#x2F;phoenix
&lt;&#x2F;span&gt;&lt;span&gt;17:17:21.434 [info]  GET &#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.6.tar
&lt;&#x2F;span&gt;&lt;span&gt;17:17:21.522 [info]  Sent 200 in 88ms
&lt;&#x2F;span&gt;&lt;span&gt;17:17:21.523 [info]  Sent 200 in 89ms
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However for every package, it downloaded every available version of
it:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;17:16:24.717 [debug] MiniRepo.Mirror.Server fetching tarball phoenix-1.5.1.tar
&lt;&#x2F;span&gt;&lt;span&gt;17:16:25.301 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.4.17.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;17:16:25.309 [debug] MiniRepo.Mirror.Server fetching tarball phoenix-1.5.2.tar
&lt;&#x2F;span&gt;&lt;span&gt;17:16:26.331 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.0-rc.0.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;17:16:26.336 [debug] MiniRepo.Mirror.Server fetching tarball phoenix-1.5.3.tar
&lt;&#x2F;span&gt;&lt;span&gt;17:16:27.206 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.0.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;17:16:27.228 [debug] MiniRepo.Mirror.Server fetching tarball phoenix-1.5.4.tar
&lt;&#x2F;span&gt;&lt;span&gt;17:16:28.017 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.1.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;17:16:28.029 [debug] MiniRepo.Mirror.Server fetching tarball phoenix-1.5.5.tar
&lt;&#x2F;span&gt;&lt;span&gt;17:16:29.008 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.2.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;17:16:29.022 [debug] MiniRepo.Mirror.Server fetching tarball phoenix-1.5.6.tar
&lt;&#x2F;span&gt;&lt;span&gt;17:16:29.706 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.3.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;17:16:30.375 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.4.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;17:16:30.967 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.5.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;17:16:31.568 [debug] {MiniRepo.Store.Local, :put, &amp;quot;data&#x2F;repos&#x2F;hexpm_mirror&#x2F;tarballs&#x2F;phoenix-1.5.6.tar&amp;quot;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is problematic if the application only uses a single&#x2F;fixed version of
an dependency. The current application does not support a targeted
version perhaps in a &lt;code&gt;name&lt;&#x2F;code&gt;-&lt;code&gt;version&lt;&#x2F;code&gt; format:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;PACKAGES=&amp;quot;decimal phoenix-1.5.6&amp;quot; mix run --no-halt
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In this case, all of the &lt;code&gt;decimal&lt;&#x2F;code&gt; versions are downloaded while a
specific version for &lt;code&gt;phoenix&lt;&#x2F;code&gt;. Hacking this behavior can be done by
changing two files:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# config&#x2F;dev.exs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;packages &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PACKAGES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot; &amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; package &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;case &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;parts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reject&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_nil&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# lib&#x2F;mini_repo&#x2F;mirror&#x2F;server.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sync&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Since mirror.only is now an list of tuples instead of strings
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # We need to handle every mirror.only
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  only_packages &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  versions &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; map &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; versions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; only_packages&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sync_created_packages&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Before the main loop, load the pinned version map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  only_map &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; releases&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sync_package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Filter out releases if a pinned version exists
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  releases &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pin_version &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;releases&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; release &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; release&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;version &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pin_version &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    releases
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sync_releases&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Before the main loop, load the pinned version map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  only_map &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; releases&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sync_package&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Filter out releases if a pinned version exists
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  releases &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pin_version &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only_map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;created&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; release &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; release &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pin_version &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;created
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  map &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;created&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; releases&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Regardless of the experimental hack, how about we test on a new
minimal &lt;code&gt;phoenix&lt;&#x2F;code&gt; app:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;mix archive.install hex phx_new 1.5.6
&lt;&#x2F;span&gt;&lt;span&gt;mix phx.new hello --no-html --no-webpack --no-ecto --no-gettext --no-dashboard
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;cd hello
&lt;&#x2F;span&gt;&lt;span&gt;HEX_MIRROR=http:&#x2F;&#x2F;localhost:4000&#x2F;repos&#x2F;hexpm_mirror mix deps.get
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Change port from 4000 to avoid conflict
&lt;&#x2F;span&gt;&lt;span&gt;sed -i -r s&#x2F;4000&#x2F;5000&#x2F; config&#x2F;dev.exs
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;mix phx.server
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Repeatedly running &lt;code&gt;mix deps.get&lt;&#x2F;code&gt; and updating &lt;code&gt;PACKAGES&lt;&#x2F;code&gt; until it succeeds:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;PACKAGES=&amp;quot;cowboy cowboy_telemetry cowlib decimal jason mime phoenix phoenix_html phoenix_pubsub plug plug_cowboy plug_crypto ranch telemetry telemetry_metrics telemetry_poller&amp;quot; mix run --no-halt
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If I had to determine the exact version for each package without a
&lt;code&gt;mix.lock&lt;&#x2F;code&gt;, it would be tedious so the previous hack is a post-setup
optimization. Anyway, the test app runs so our mirror works and time
to &lt;em&gt;dockerize&lt;&#x2F;em&gt; it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;docker&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#docker&quot; aria-label=&quot;Anchor link for: docker&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Docker&lt;&#x2F;h2&gt;
&lt;p&gt;Since this uses &lt;code&gt;mix release&lt;&#x2F;code&gt; to package the app, I copy over
&lt;code&gt;config&#x2F;dev.exs&lt;&#x2F;code&gt; to &lt;code&gt;config&#x2F;releases.exs&lt;&#x2F;code&gt; and clean up the repo:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Remove the &lt;code&gt;test_repo&lt;&#x2F;code&gt; and security keys since I only need
mirroring, not publishing&lt;&#x2F;li&gt;
&lt;li&gt;Change the package directory to &lt;code&gt;data&lt;&#x2F;code&gt; instead of &lt;code&gt;priv&#x2F;data&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Set the fetch timeout to &lt;code&gt;:infinity&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Set the max concurrency to &lt;code&gt;nil&lt;&#x2F;code&gt; to use all machine cores.&lt;&#x2F;li&gt;
&lt;li&gt;Set the sync interval to &lt;code&gt;:timer.hours(24)&lt;&#x2F;code&gt; to sync daily instead
of 5 minutes.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Since this is a released container, I use this &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;elixir-bit-caching-docker-dependencies&#x2F;Dockerfile.mirror&quot;&gt;Dockerfile&lt;&#x2F;a&gt; instead:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;dockerfile&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-dockerfile &quot;&gt;&lt;code class=&quot;language-dockerfile&quot; data-lang=&quot;dockerfile&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; elixir:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;1.9.0-alpine &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;AS &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;builder
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mix local.hex --force &amp;amp;&amp;amp; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        mix local.rebar --force
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;WORKDIR &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&#x2F;opt&#x2F;app
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; config .&#x2F;config
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; lib .&#x2F;lib
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rel .&#x2F;rel
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; mix.exs .
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; mix.lock .
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ENV &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;MIX_ENV=prod
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;RUN &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mix deps.get &amp;amp;&amp;amp; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        mix deps.compile &amp;amp;&amp;amp; \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        mix release
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; elixir:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;1.9.0-alpine &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;AS &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;app
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;WORKDIR &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&#x2F;opt&#x2F;app
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; --from=builder &#x2F;opt&#x2F;app&#x2F;_build .
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;EXPOSE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;4000
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ENV &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;PORT=4000
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ENV &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;PACKAGES=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ENV &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;PACAKGE_DIR=&#x2F;opt&#x2F;app&#x2F;hex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;CMD &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;prod&#x2F;rel&#x2F;mini_repo&#x2F;bin&#x2F;mini_repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;More importantly, the &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;elixir-bit-caching-docker-dependencies&#x2F;docker-compose.mirror.yml&quot;&gt;docker-compose.yml&lt;&#x2F;a&gt; looks good:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;3.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;services&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: .
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dockerfile&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Dockerfile
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;restart&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;always
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&#x2F;cache:&#x2F;opt&#x2F;app&#x2F;data
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;networks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;aliases&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hexpm_mirror
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;environment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;PORT&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;20000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;PACKAGES&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        cowboy
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        cowboy_telemetry
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        cowlib
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        decimal
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        jason
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        mime
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        phoenix
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        phoenix_html
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        phoenix_pubsub
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        plug
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        plug_cowboy
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        plug_crypto
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        ranch
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        telemetry
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        telemetry_metrics
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        telemetry_poller
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;networks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;external&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The important part here is the &lt;code&gt;network&lt;&#x2F;code&gt; setting which allows another
container to use this. Referencing the development template, this can
be done by adding the &lt;code&gt;HEX_MIRROR&lt;&#x2F;code&gt; variable and &lt;code&gt;hexpm&lt;&#x2F;code&gt; network:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;3.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;services&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;networks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;electron&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;environment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;HEX_MIRROR&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;http:&#x2F;&#x2F;hexpm_mirror:20000&#x2F;repos&#x2F;hexpm_mirror&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;networks&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;hexpm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;external&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Staring the mirror and waiting for it to sync:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;docker-compose build
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;docker network create hexpm
&lt;&#x2F;span&gt;&lt;span&gt;docker-compose up
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;em&gt;Elixir&lt;&#x2F;em&gt; container should now build faster thanks to the local mirror:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;docker-compose down -v
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;docker network create hexpm
&lt;&#x2F;span&gt;&lt;span&gt;docker-compose up
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;While we were able to locally cache certain &lt;em&gt;Elixir&lt;&#x2F;em&gt; dependencies in
&lt;em&gt;docker&lt;&#x2F;em&gt;, it did take quite some work and it is not truly optimized.
It would be nice if the package caching can be dynamic where the
mirror downloads the package if it does not exist. While a static list
is fine, it can be stale if a new library is introduced and is not
synced which can cause the same build errors. Another lingering issue
is the excess downloads which feels ironic but makes sense when the
mix dependencies are not pinned to a specific version. Nonetheless, it
works and time will tell if it will reduce the network fetch issue.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Rit Journal - Myers Diff</title>
          <pubDate>Mon, 26 Oct 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev_journal/rit-journal-myers-diff/</link>
          <guid>https://fnlog.dev/dev_journal/rit-journal-myers-diff/</guid>
          <description>&lt;h2 id=&quot;chapter-11-myers-diff&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#chapter-11-myers-diff&quot; aria-label=&quot;Anchor link for: chapter-11-myers-diff&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Chapter 11: Myers Diff&lt;&#x2F;h2&gt;
&lt;p&gt;For my first chapter journal entry, the task is to implement the
&lt;a href=&quot;https:&#x2F;&#x2F;blog.jcoglan.com&#x2F;2017&#x2F;02&#x2F;12&#x2F;the-myers-diff-algorithm-part-1&#x2F;&quot;&gt;Myer&#x27;s diff algorithm&lt;&#x2F;a&gt; which calculates the changes shown in &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-diff#Documentation&#x2F;git-diff.txt---diff-algorithmpatienceminimalhistogrammyers&quot;&gt;git diff&lt;&#x2F;a&gt;
and possibly integrate to &lt;code&gt;git status&lt;&#x2F;code&gt; next. While that is the
default, it can be changed and have different results which is
fascinating. I will not discuss the algorithm here so do checkout
other sources such as from the &lt;a href=&quot;https:&#x2F;&#x2F;blog.jcoglan.com&#x2F;2017&#x2F;02&#x2F;12&#x2F;the-myers-diff-algorithm-part-1&#x2F;&quot;&gt;author&#x27;s blog&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Apologies if the journal is unstructured or sparse, I am trying to
find the balance between being a personal journal and thoroughly
reviewed article.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Source code for this chapter can be found &lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev_journal&#x2F;rit-journal-myers-diff&#x2F;diff.rs&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sketch&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#sketch&quot; aria-label=&quot;Anchor link for: sketch&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Sketch&lt;&#x2F;h3&gt;
&lt;p&gt;Generally, the objective is to take two lists of comparable items and
return an iterator of diffs to convert one to the other. My basic
sketch of this algorithm is:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub enum &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;lt;&amp;#39;a, T&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a [T],
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a [T],
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Iterator &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unimplemented!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T], &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unimplemented!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ideally, it is used like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; source &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ABCABBA&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chars&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;CBABAC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chars&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; symbol &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It should output:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;-A
&lt;&#x2F;span&gt;&lt;span&gt;-B
&lt;&#x2F;span&gt;&lt;span&gt; C
&lt;&#x2F;span&gt;&lt;span&gt;+B
&lt;&#x2F;span&gt;&lt;span&gt; A
&lt;&#x2F;span&gt;&lt;span&gt; B
&lt;&#x2F;span&gt;&lt;span&gt;-B
&lt;&#x2F;span&gt;&lt;span&gt; A
&lt;&#x2F;span&gt;&lt;span&gt;+C
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The algorithm itself is straightforward to implement with finding the
best point in the main function and backtracking with the iterator.
The first part of the &lt;em&gt;Ruby&lt;&#x2F;em&gt; source code translates easily but the
backtracking iterator is the challenging part. Looking back, the
fundamental lesson for this chapter is keeping it simple since it
does take time to refactor or experiment with a typed language. I did
want to explore other &lt;em&gt;Rust&lt;&#x2F;em&gt; traits such as &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;convert&#x2F;trait.AsRef.html&quot;&gt;AsRef&lt;&#x2F;a&gt; trait but were
unnecessary in the end which is a waste.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;iterator-or-list&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#iterator-or-list&quot; aria-label=&quot;Anchor link for: iterator-or-list&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Iterator or List&lt;&#x2F;h3&gt;
&lt;p&gt;Since the book returned the diffs as an &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;trait.Iterator.html&quot;&gt;iterator&lt;&#x2F;a&gt;, it follows that the
function should do so as well. However, since the backtracking logic
yields diffs backwards, the iterator has to be reversed whim implies:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T], &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Iterator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item = Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Diffs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To use &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;trait.Iterator.html#method.rev&quot;&gt;Iterator::rev&lt;&#x2F;a&gt; requires implementing a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;trait.DoubleEndedIterator.html&quot;&gt;double ended iterator&lt;&#x2F;a&gt;.
The easiest way with the diff iterator is to collect the iterator
into a list then convert it back to an iterator:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T], &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Iterator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item = Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Diffs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Returning an iterator here seems inefficient. Why not return the
ordered diffs instead? Why not get rid of the iterator altogether to
make the code more compact?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T], &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diffs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;traces&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Iterator code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reverse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    diffs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Sadly, I was able to implement the algorithm completely before
realizing this and refactored afterwards. Perhaps I was too eager and
ambitious with implementing an iterator that I made it unnecessarily
harder for myself. Another lesson in keeping it simple but it was
rather fun making the iterator work.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;negative-indices&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#negative-indices&quot; aria-label=&quot;Anchor link for: negative-indices&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Negative Indices&lt;&#x2F;h3&gt;
&lt;p&gt;In &lt;em&gt;Ruby&lt;&#x2F;em&gt;, accessing array&#x2F;list elements with &lt;a href=&quot;https:&#x2F;&#x2F;ruby-doc.org&#x2F;core-2.7.0&#x2F;Array.html#class-Array-label-Accessing+Elements&quot;&gt;negative indices&lt;&#x2F;a&gt; start
from the end instead of the beginning. Since the book uses this
feature, we need to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rfcs&#x2F;issues&#x2F;2249&quot;&gt;translate&lt;&#x2F;a&gt; that to &lt;em&gt;Rust&lt;&#x2F;em&gt;. We could implement a
wrapper trait, &lt;code&gt;ExtSlide&lt;&#x2F;code&gt; to support negative indices that is easily
done with &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;ops&#x2F;trait.Index.html&quot;&gt;std::ops::Index&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;ops&#x2F;trait.IndexMut.html&quot;&gt;std::ops::IndexMut&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ExtSlice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut [T]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ExtSlice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Output &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Output &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_negative&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ExtSlice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;index_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Output &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_negative&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ExtSlide&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;],&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;],&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;],&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;],&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This works but now we cannot access elements past &lt;code&gt;isize&lt;&#x2F;code&gt;. For
example if slice indices are &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;primitive.u8.html&quot;&gt;u8&lt;&#x2F;a&gt;, the maximum value of &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;primitive.i8.html&quot;&gt;i8&lt;&#x2F;a&gt; is 127, so
how to access elements 128 and above? Since the algorithm is simple,
I opted to compute it manually to avoid any issue altogether:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;inline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;normalize_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;size&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_negative&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        size &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;abs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as usize
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;&amp;#39;outer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; d &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; k &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;step_by&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;normalize_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;k &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; next_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;normalize_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;k &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; k &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== -&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;d &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;k &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; d &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;].&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;].&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) { }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;How to implement negative indices without precision loss? Perhaps
implementing a custom &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;ops&#x2F;trait.RangeBounds.html&quot;&gt;std::ops::RangeBounds&lt;&#x2F;a&gt; can work but that is
currently beyond scope. Still interesting to know that indexing
operation can be implemented to enable this feature.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;backtracking&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#backtracking&quot; aria-label=&quot;Anchor link for: backtracking&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Backtracking&lt;&#x2F;h3&gt;
&lt;p&gt;Initially, the way backtracking was presented made me think of an
alternative representation. Since the best values at each round are
only stored, retracing from the best path is lost. The idea is then
to &lt;strong&gt;&lt;strong&gt;clone&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; and store the previous rounds into a list so that
backtracking is possible.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;resize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; traces&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;&amp;#39;outer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; d &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    traces&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Instead of cloning the values on each round, what if we store the
path on each value and return that in the end?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&amp;gt;)&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;&amp;#39;outer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; d &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; k &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;step_by&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; this_path &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;].&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        this_path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;this_x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; this_y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; this_x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; m &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; this_y &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I completed the initial implementation with this layout but I
realized that is not as efficient as I thought. Given &lt;code&gt;m&lt;&#x2F;code&gt; is the
length of the source, &lt;code&gt;n&lt;&#x2F;code&gt; the length of the target, &lt;code&gt;d&lt;&#x2F;code&gt; as the number
of rounds, my approach allocates &lt;code&gt;2 * m * n + 1&lt;&#x2F;code&gt; small vectors that
grow to &lt;code&gt;d&lt;&#x2F;code&gt; elements while the original stores &lt;code&gt;d&lt;&#x2F;code&gt; vectors of &lt;code&gt;2 * m * n + 1&lt;&#x2F;code&gt; size. While equal, the original has fewer allocations and
more compact memory layout. I keep relearning the old lesson of
planning ahead before writing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;testing&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#testing&quot; aria-label=&quot;Anchor link for: testing&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Testing&lt;&#x2F;h3&gt;
&lt;p&gt;Aside from testing the base case, the book provides no other test. To
do &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;quickcheck&quot;&gt;property-based testing&lt;&#x2F;a&gt;, I could generate the diffs and compute the
left and right text, then the applied diff should be the same. Since
we are using &lt;code&gt;quickcheck&lt;&#x2F;code&gt;, we want to create a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;quickcheck#generating-structs&quot;&gt;generator type&lt;&#x2F;a&gt; for our
&lt;code&gt;Diff&lt;&#x2F;code&gt; type. However, since it contains a reference field, we need to
create an owned version:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub enum &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;lt;&amp;#39;a, T&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mod &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;tests &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Arbitrary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Gen&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use super&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;enum &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;lt;T&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next step is to create a generator for the diff collection. Ideally,
the type is &lt;code&gt;Vec&amp;lt;TestDiff&amp;lt;T&amp;gt;&amp;gt;&lt;&#x2F;code&gt;; however, since we do not own &lt;code&gt;Vec&lt;&#x2F;code&gt;,
we need to wrap it with a struct and implement the trait on that
because of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rfcs&#x2F;blob&#x2F;master&#x2F;text&#x2F;1023-rebalancing-coherence.md&quot;&gt;coherence rules&lt;&#x2F;a&gt;. To generate the collection, a list of
values are generated uniquely by &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;collections&#x2F;struct.BTreeSet.html&quot;&gt;BTreeSet&lt;&#x2F;a&gt; instead of an &lt;code&gt;Vec&lt;&#x2F;code&gt; and
then randomly mapped to a diff enum:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collections&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;rand&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Rng&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TestDiffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Arbitrary &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Arbitrary &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TestDiffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;arbitrary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;G&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Gen&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; G&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Arbitrary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;arbitrary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diffs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; values
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; g&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;gen&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rem_euclid&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_ =&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unreachable!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        TestDiffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We can now define the property test using the generator. More
importantly, how do we extract the source and target text given the
diffs? Since insertions come from the target and deletions from the
source, we can iterate through the diffs and collect them
appropriately:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs_are_correct&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;test_diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TestDiffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diffs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; test_diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; source &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;with_capacity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; diff &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unimplemented!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, we apply the &lt;code&gt;myers&lt;&#x2F;code&gt; function on the source and target and
expect the generated diffs to be the same:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs_are_correct&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;test_diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TestDiffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; actual_diffs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;actual_diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expected_diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; actual_diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;actual_diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expected_diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;actual&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;actual&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;actual&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; actual &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expected &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_ =&amp;gt; return false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running this test exposes two edge cases and one generator issue. A
common edge case is handling empty list arguments. Adding the test
case directly and fixing it simple:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T], &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Return quickly when both lists are empty
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_empty&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_empty&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;empty_values_should_work&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)], &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[], &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)], &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[]));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[], &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[]));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The trickier issue is that if the starting values of the source and
target are the same, it will ignore that diagonal&#x2F;free move and
proceed normally which will generate an unequal diff. The fix is
simply to apply the while diagonal loop on the first iteration and
augment the new point with that:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T], &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; [T]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;&amp;#39;outer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; d &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Check for the diagonal in the search phase
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; delta &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; d &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; m &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            i
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; k &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;step_by&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            this_x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; delta&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            this_y &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; delta&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; this_x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; m &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; this_y &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;this_x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;this_y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] { }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Check for the diagonal right after the backtracking phase
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; y &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        y &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reverse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    diffs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;same_initial_should_work&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;], &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;])
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Whether these two issues are fixed later in the book or because of my
implementation, the property test thankfully caught these issues
early on. However, I must confess the actual and expected diffs are
not equal. Specifically, they have the same elements but sometimes
not in the same order. For example:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; EXPECTED
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;20&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;78&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;99&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; ACTUAL
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Same&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;20&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Delete&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;99&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;78&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Sadly, our generation method is basic and incompatible with how
&lt;code&gt;myers&lt;&#x2F;code&gt; generates diff. After struggling for a while, it was enough
to test when the diffs are sorted and are still equal:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Added extra traits for sorting: PartialEq, PartialOrd, Eq, Ord
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialOrd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Eq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;enum &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;lt;&amp;#39;a, T&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialOrd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Eq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;enum &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TestDiff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;lt;T&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs_are_correct&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;test_diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TestDiffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; actual_diffs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;myers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    actual_diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sort&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sort&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;actual_diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expected_diff&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; actual_diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;diffs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Rest of the coe
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While the generation is imperfect, sorting the diffs before comparing
them make the test consistent. My lesson here is that perfect tests
are nice but must be weighted against time and effort. Nonetheless,
the algorithm works safely and can now declare completion.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;histogram&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#histogram&quot; aria-label=&quot;Anchor link for: histogram&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Histogram&lt;&#x2F;h2&gt;
&lt;p&gt;In my early years with &lt;code&gt;git&lt;&#x2F;code&gt;, I thought what made it special among
other &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Version%5Fcontrol&quot;&gt;VCS&lt;&#x2F;a&gt; is that it stores the diffs instead of the files that makes
it more efficient in computing which is incorrect. In reality, both
old and new file are stored then the diff between them is computed to
show in &lt;code&gt;git diff&lt;&#x2F;code&gt;. My flawed thinking comes from applying a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Fold%5F(higher-order%5Ffunction)&quot;&gt;fold&lt;&#x2F;a&gt; of
diffs to compute the end file as in an empty file plus &lt;code&gt;hello&lt;&#x2F;code&gt; then
finally &lt;code&gt;world&lt;&#x2F;code&gt; is &lt;code&gt;helloworld&lt;&#x2F;code&gt;. The issue is that this computation is
not unique as in &lt;code&gt;hell&lt;&#x2F;code&gt; then &lt;code&gt;oworld&lt;&#x2F;code&gt; produces the same output. With
multiple ways to compute the same text, what then is the best way to
compute them?&lt;&#x2F;p&gt;
&lt;p&gt;Rather, how does one define quality or better? Git has four diff
algorithms: &lt;code&gt;myers&lt;&#x2F;code&gt;, &lt;code&gt;minimal&lt;&#x2F;code&gt;, &lt;code&gt;patience&lt;&#x2F;code&gt; and &lt;code&gt;histogram&lt;&#x2F;code&gt; where the
default is &lt;code&gt;myers&lt;&#x2F;code&gt;. How do they differ? I know &lt;code&gt;myers&lt;&#x2F;code&gt; is greedy and
prefers deletions to insertions, but do not know or have experience
about the others. Reading this &lt;a href=&quot;https:&#x2F;&#x2F;link.springer.com&#x2F;article&#x2F;10.1007&#x2F;s10664-019-09772-z&quot;&gt;paper&lt;&#x2F;a&gt; and other searches suggest that
&lt;a href=&quot;http:&#x2F;&#x2F;archive.eclipse.org&#x2F;jgit&#x2F;docs&#x2F;jgit-2.0.0.201206130900-r&#x2F;apidocs&#x2F;org&#x2F;eclipse&#x2F;jgit&#x2F;diff&#x2F;HistogramDiff.html&quot;&gt;histogram&lt;&#x2F;a&gt;, a modified version of &lt;a href=&quot;https:&#x2F;&#x2F;bramcohen.livejournal.com&#x2F;73318.html&quot;&gt;patience&lt;&#x2F;a&gt;, is more human-readable
specially with code. Consider this sample code about a right triangle:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;RightTriangle&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;RightTriangle &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hypothenuse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sum &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        sum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sqrt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;area&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;a &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2.0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I will do three modifications: move the function &lt;code&gt;RightTriangle::area&lt;&#x2F;code&gt;
before &lt;code&gt;RightTriangle::hypothenuse&lt;&#x2F;code&gt;, add a new function
&lt;code&gt;RightTriangle::perimeter&lt;&#x2F;code&gt;, and refactor &lt;code&gt;RightTriangle::hypothenuse&lt;&#x2F;code&gt;.
Here is the new snippet:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;RightTriangle&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;RightTriangle &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;area&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;a &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2.0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hypothenuse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sqrt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;perimeter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;f32 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        a &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; b &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hypothenuse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running first &lt;code&gt;git diff --diff-algorithm=myers&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;-    fn hypothenuse(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;-        let sum = a.powi(2) + b.powi(2);
&lt;&#x2F;span&gt;&lt;span&gt;+    fn area(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;+        (a * b) &#x2F; 2.0
&lt;&#x2F;span&gt;&lt;span&gt;+    }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;-        sum.sqrt()
&lt;&#x2F;span&gt;&lt;span&gt;+    fn hypothenuse(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;+        (a.powi(2) + b.powi(2)).sqrt()
&lt;&#x2F;span&gt;&lt;span&gt;     }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;-    fn area(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;-        (a * b) &#x2F; 2.0
&lt;&#x2F;span&gt;&lt;span&gt;+    fn perimeter(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;+        a + b + Self::hypothenuse(a, b)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At a quick glance, it is hard to see what is going on here. With &lt;code&gt;git diff --diff-algorithm=histogram&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;-    fn hypothenuse(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;-        let sum = a.powi(2) + b.powi(2);
&lt;&#x2F;span&gt;&lt;span&gt;-
&lt;&#x2F;span&gt;&lt;span&gt;-        sum.sqrt()
&lt;&#x2F;span&gt;&lt;span&gt;-    }
&lt;&#x2F;span&gt;&lt;span&gt;-
&lt;&#x2F;span&gt;&lt;span&gt;     fn area(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;         (a * b) &#x2F; 2.0
&lt;&#x2F;span&gt;&lt;span&gt;     }
&lt;&#x2F;span&gt;&lt;span&gt;+
&lt;&#x2F;span&gt;&lt;span&gt;+    fn hypothenuse(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;+        (a.powi(2) + b.powi(2)).sqrt()
&lt;&#x2F;span&gt;&lt;span&gt;+    }
&lt;&#x2F;span&gt;&lt;span&gt;+
&lt;&#x2F;span&gt;&lt;span&gt;+    fn perimeter(a: f32, b: f32) -&amp;gt; f32 {
&lt;&#x2F;span&gt;&lt;span&gt;+        a + b + Self::hypothenuse(a, b)
&lt;&#x2F;span&gt;&lt;span&gt;+    }
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This looks easier to understand. While this is a contrived refactoring
example, it does show the possible advantage of this algorithm. If
&lt;code&gt;histogram&lt;&#x2F;code&gt; is more human-readable, why is it not the default or
popular? I believe &lt;code&gt;git&lt;&#x2F;code&gt; does not need to focus on subjective diff
algorithms, instead opting for the simplest and offering
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;gitattributes#%5Fdefining%5Fan%5Fexternal%5Fdiff%5Fdriver&quot;&gt;configurability&lt;&#x2F;a&gt;. Rather than arguing the use for &lt;code&gt;histogram&lt;&#x2F;code&gt;, changing
the diff algorithm is a minor potential and more importantly cannot be
configured in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;&quot;&gt;GitHub&lt;&#x2F;a&gt; or major git repositories to see the results as a
team. Still having potentially better diffs locally while adding or
merging is worth a try like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;git config --global diff.algorithm histogram
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I will get longer diffs in the worst case and perhaps mostly not
notice the difference, but I know now at least the diff view can be
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;gitattributes#%5Fdefining%5Fan%5Fexternal%5Fdiff%5Fdriver&quot;&gt;configured&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Elixir Bit - ISO 8601 Duration</title>
          <pubDate>Fri, 23 Oct 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/elixir-bit-iso-8601-duration/</link>
          <guid>https://fnlog.dev/wanderer/elixir-bit-iso-8601-duration/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I have several &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;elixir&#x2F;1.11.1&#x2F;GenServer.html&quot;&gt;GenServers&lt;&#x2F;a&gt; that sync data from a third party service
and store them in-memory to reduce network calls for a &lt;a href=&quot;https:&#x2F;&#x2F;graphql.org&#x2F;&quot;&gt;GraphQL&lt;&#x2F;a&gt; client.
My usual formula is:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ExternalService &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GenServer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;alias __MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;as&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;State
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defstruct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start_link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GenServer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GenServer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;call&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;timer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;send_interval&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sync_interval&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;__sync__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;State&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_call&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _from&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;State&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;reply&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handle_info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;__sync__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    new_data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;random&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Pretend randomness is an API call
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;noreply&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;state &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sync_interval&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()[:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;sync_interval&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;timer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;minutes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Application&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_all_env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The toy module above is an interface to an external service and syncs
data every five minutes. The trick is &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erlang&#x2F;otp&#x2F;edit&#x2F;maint&#x2F;lib&#x2F;stdlib&#x2F;doc&#x2F;src&#x2F;timer.xml#L208&quot;&gt;:timer.send_interval&#x2F;3&lt;&#x2F;a&gt; which
triggers &lt;code&gt;handle_info(:__sync__, state)&lt;&#x2F;code&gt; periodically in milliseconds.
For its runtime configuration with &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;distillery&#x2F;config&#x2F;runtime.html#config-providers&quot;&gt;distillery&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;toml.io&#x2F;en&#x2F;&quot;&gt;TOML&lt;&#x2F;a&gt;, it looks like
this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MyApp.ExternalService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;sync_interval &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;300000 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# :timer.minutes(5)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since I have many of these, my problem is that reading an integer
value to represent an interval is harder to read, communicate and
configure as a team. While I still standardize to milliseconds, a
string-like representation or standard format would be nice to express
various intervals like:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MyApp.ExternalService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;sync_interval &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;5 min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MyApp.HeavyService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;fast_sync_interval &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1 day&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;slow_sync_interval &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= [&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;30&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;]  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Requires custom transformer
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;solution&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#solution&quot; aria-label=&quot;Anchor link for: solution&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Solution&lt;&#x2F;h2&gt;
&lt;p&gt;A standard date duration format already exists: &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;ISO%5F8601#Durations&quot;&gt;ISO 8601 Duration&lt;&#x2F;a&gt;.
Here are some sample representations to build intuition:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;P1Y&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# 1 year(s)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;P2M1W&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# 2 months and 1 week(s)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;P1Y1D&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# 1 year(s) and 1 day(s)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT5M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# 5 minutes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT1H5S&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# 1 hour(s) and 5 seconds
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;P1DT12H&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# 1 day(s) and 12 hours
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It does feel rather too compact and mentally parsing it might take
time. My suggestion is to think of it as having a date and time part,
then reading slowly the abbreviations based on the part. The date&#x2F;time
library, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bitwalker&#x2F;timex&quot;&gt;timex&lt;&#x2F;a&gt;, can parse these expressions and be easily integrated:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ExternalService &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Same code as before
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;alias &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Timex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Duration
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sync_interval&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()[:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;sync_interval&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT5M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Duration&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Duration&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_milliseconds&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Since this function may return a float...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; round&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# ... we need to cast it to integer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The format looks promising in TOML:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MyApp.ExternalService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;sync_interval &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT5M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To drive the point further, it can also express future dates well such
as expiration dates. For example, a reset password link expires in 2
days in development but 30 minutes in production for security:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Accounts &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;alias &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;UUID
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;alias &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Timex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Duration
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;alias &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;User&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reset_password&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    user &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_by&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;User&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    user
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;User&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reset_password_changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    # Then send email with Bamboo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;password_reset_expiration_period&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    # Instead of:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    # (config()[:password_reset_expiration_period] || :timer.hours(2 * 24))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()[:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;password_reset_expiration_period&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;P2D&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Duration&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Application&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_all_env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;User &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Schema
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;alias &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;UUID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reset_password_changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    # Instead of:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    # expiration_date = DateTime.add(DateTime.utc_now(), milliseconds: MyApp.password_reset_expiration_period())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    expiration_date &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Timex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Date&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;utc_today&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;password_reset_expiration_period&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    entity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;change&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;password_reset_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;UUID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;generate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;password_reset_expiration&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expiration_date
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The configuration becomes standardized across the board as well:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# config&#x2F;dev.exs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Accounts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Instead of:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # password_reset_expiration_period: :timer.hours(2 * 24)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;password_reset_expiration_period&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;P2D&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# config&#x2F;prod.exs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;conifg &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Accounts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # Instead of:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  # password_reset_expiration_period: :timer.minutes(15)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;password_reset_expiration_period&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT15M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;toml&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-toml &quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;my_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MyApp.Accounts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Instead of:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# password_reset_expiration_period = 172800000 # :timer.hours(2 * 24)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# password_reset_expiration_period = 900000    # :timer.minutes(15)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;password_reset_expiration_period &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;P2D&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# or
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;password_reset_expiration_period &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;= &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;PT15M&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Using milliseconds is still viable if the introduction of a new format
or library is too much; however, one can write a simple and quick
space delimited format to retort:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Duration &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;formats %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ms&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;sec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1_000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;60 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1_000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hour&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;60 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;60 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1_000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;day&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;24 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;60 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;60 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1_000
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;convert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    units &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;formats&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;downcase&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot; &amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reduce_while&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; acc &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;case &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Integer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; unit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; unit &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; units &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          multiplier &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fetch!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;units&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; unit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;cont&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; acc &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; multiplier &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        _ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;halt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         milliseconds &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; milliseconds&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Duration&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;convert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1hour&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Duration&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;convert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;15min 20sec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Nonetheless, consider using a human-readable format to make date&#x2F;time
configuration easier and more intuitive.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes&quot; aria-label=&quot;Anchor link for: notes&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;avoid-months-and-years&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#avoid-months-and-years&quot; aria-label=&quot;Anchor link for: avoid-months-and-years&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Avoid Months and Years&lt;&#x2F;h3&gt;
&lt;p&gt;As an exercise, I tried porting &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vercel&#x2F;ms&quot;&gt;ms.js&lt;&#x2F;a&gt; into an Elixir library, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;ex%5Fms&quot;&gt;ex_ms&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Millisecond&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ms!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ms&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ms!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1h 1m 1s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# 86400000
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ms!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1days 12 hours&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# 129600000
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ms&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;12 hours 1days&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# :error
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What I learned from this exercise is that representing duration with
milliseconds is safe until it comes to months or years. How many days
are there in a month? How many days are there in a year? It depends
on both questions. Looking at &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bitwalker&#x2F;timex&#x2F;blob&#x2F;b08d087556f77055acaf45e98d838eae1c1e9244&#x2F;lib&#x2F;parse&#x2F;duration&#x2F;parsers&#x2F;iso8601.ex#L48&quot;&gt;Timex&lt;&#x2F;a&gt;, it interprets a year as 365 days
while with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;henrypoydar&#x2F;chronic%5Fduration&#x2F;blob&#x2F;55f992d6715a0920fefb5c4051e9eff40f948a21&#x2F;lib&#x2F;chronic%5Fduration.rb#L63&quot;&gt;ChronicDuration&lt;&#x2F;a&gt; as 365.25 days. Not that the libraries are
incorrect but some precision is lost when dealing with months or
years. So when describing a duration, avoid using months or years and
use 30 and 366 days respectively for safety regardless of format or
library.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A Mortician&#x27;s Tale PC - Respecting The Dead</title>
          <pubDate>Sun, 11 Oct 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/a-mortician-s-tale-pc-respecting-the-dead/</link>
          <guid>https://fnlog.dev/gamer/a-mortician-s-tale-pc-respecting-the-dead/</guid>
          <description>&lt;h2 id=&quot;a-mortician-s-tale&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#a-mortician-s-tale&quot; aria-label=&quot;Anchor link for: a-mortician-s-tale&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
A Mortician&#x27;s Tale&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;laundrybear.itch.io&#x2F;morticians-tale&quot;&gt;A Mortician&#x27;s Tale PC&lt;&#x2F;a&gt; lets the player see how a remains is prepared
for a funeral. It has two main mechanics: embalming and cremation.
Since the player is responsible for the remains in the funeral, paying
respect to the family and deceased is required. The game loop is
simple but it evokes meditation or feelings about the physicality of
death. What importance and rituals do we place? I appreciate this game
for tackling a morbid subject which takes around an 1 hour to finish.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#thoughts&quot; aria-label=&quot;Anchor link for: thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;The game&#x27;s short and linear experience will stay with me; however, I
do feel it is lacking to fully sell the experience or meditation. The
game does not have failure states which is fine but I cannot perceive
the quality of my work or any narrative complication. What if an
accident occurred and seeing those repercussion play out? As it
stands, I do not have to put effort in the gameplay aside from its
morbid context. When other characters in the game praise my work and
empathy, it feels disconnected.&lt;&#x2F;p&gt;
&lt;p&gt;While having a simple story is fine, the player character&#x27;s motivation
or story is not explained which is a shame. Is it out of charity or
poverty? Is it a stressful to terrifying job? I want to know their
perspectives. Using a silent protagonist suggest role-playing but even
some dialogue options or scenes would add color or texture to a blank
character.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from the story and price, those two issues prevent me from
recommending the game. While letting the player draw their own
conclusions is admirable, it feels abstract or hollow in the end
without a strong direction to guide it. This may be the game&#x27;s scope
or intended limitation, so I am excited for a more polished and
cohesive game to follow.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Butterfly Soup PC - A Chill Experience</title>
          <pubDate>Sun, 11 Oct 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/butterfly-soup-pc-a-chil-experience/</link>
          <guid>https://fnlog.dev/gamer/butterfly-soup-pc-a-chil-experience/</guid>
          <description>&lt;h2 id=&quot;butterfly-soup&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#butterfly-soup&quot; aria-label=&quot;Anchor link for: butterfly-soup&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Butterfly Soup&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A visual novel about gay asian girls playing baseball and falling in love.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I do not agree with &lt;a href=&quot;https:&#x2F;&#x2F;brianna-lei.itch.io&#x2F;butterfly-soup&quot;&gt;Butterfly Soup PC&lt;&#x2F;a&gt;&#x27;s tagline wording since it
highlights its LGBT nature rather than its strong character and
dialogue writing. Nonetheless, it is a linear slice-of-life story of
four friends that last about 3 hours. While I cannot speak for its
LGBT quality, the group dynamics and moments is what really sells it
specially with &lt;em&gt;Noelle&lt;&#x2F;em&gt; and &lt;em&gt;Akarsha&lt;&#x2F;em&gt;. It is a straight forward and
fun ride all throughout which is nice in a sea of complex narratives
with uncertain artistic value or quality.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#thoughts&quot; aria-label=&quot;Anchor link for: thoughts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;While it is free product, I do have some minor thoughts about it as a
game or story. Since this is promoted for its romance, I did feel it a
lacking or does not have weight. I do like that the group is
supportive and that is possibly the point of the game, but it does not
give me struggles or perspectives to ponder about. This also leads to
the overarching story where there is none. It ends at a good point,
but I am curious about what follows and the changes in the dynamics.&lt;&#x2F;p&gt;
&lt;p&gt;On a character basis, &lt;em&gt;Noelle&lt;&#x2F;em&gt; is my favorite character alongside
&lt;em&gt;Akarsha&lt;&#x2F;em&gt; where their banter feels great while &lt;em&gt;Liz&lt;&#x2F;em&gt; is my favorite in
terms of design. My least favorite for me are &lt;em&gt;Diya&lt;&#x2F;em&gt; and &lt;em&gt;Min&lt;&#x2F;em&gt; despite
being the main romantic pairing. &lt;em&gt;Min&lt;&#x2F;em&gt; is strangely too rebellious
without any added flavor aside from being protective. &lt;em&gt;Diya&lt;&#x2F;em&gt; feels a
bit bland with her shyness without any complex or introspective
thoughts. With her godly athleticism, she feels like a shy main
character in a harem whom everyone revolves which is not bad but just
uninteresting. These are subjective character opinions so feel free to
disagree.&lt;&#x2F;p&gt;
&lt;p&gt;For some minor points, it has cultural references which I still
enjoyed though some escaped me, so it might date itself. Features such
as background pan or screenshake made me feel dizzier so the option to
disable is appreciated. While the story is linear, some minor
branching would be nice for replayability.&lt;&#x2F;p&gt;
&lt;p&gt;Nonetheless, the characters and writing is realistic and I enjoyed my
time with the game and would like to see more.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Rit Journal - Initial Entry</title>
          <pubDate>Tue, 06 Oct 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev_journal/rit-journal-initial-entry/</link>
          <guid>https://fnlog.dev/dev_journal/rit-journal-initial-entry/</guid>
          <description>&lt;h2 id=&quot;rit-rust-flavored-git&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rit-rust-flavored-git&quot; aria-label=&quot;Anchor link for: rit-rust-flavored-git&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Rit: Rust Flavored Git&lt;&#x2F;h2&gt;
&lt;p&gt;I was looking for another learning project after my post about &lt;a href=&quot;&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;&quot;&gt;Rust
AVL Trees&lt;&#x2F;a&gt;. I had many ideas and possibilities but after seeing and
buying &lt;a href=&quot;https:&#x2F;&#x2F;shop.jcoglan.com&#x2F;building-git&#x2F;&quot;&gt;Building Git&lt;&#x2F;a&gt;, I knew I was going to make a Rust flavored &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;&quot;&gt;git&lt;&#x2F;a&gt;.
It is ambitious and a large project possibly beyond me but a large
system allows me to think of the big picture as I work instead of
hacking away at small designs. My goal is to be able to start from an
empty project and end with pushing it to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;&quot;&gt;GitHub&lt;&#x2F;a&gt; and cloning it back
again without using &lt;code&gt;git&lt;&#x2F;code&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Eating_your_own_dog_food&quot;&gt;dogfooding&lt;&#x2F;a&gt;. The book calls it project
&lt;code&gt;jit&lt;&#x2F;code&gt;, I dub mine &lt;code&gt;rit&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;While I just need to follow the majority of the logic and code in the
book, I have to adapt it to &lt;em&gt;Rust&lt;&#x2F;em&gt; instead of &lt;em&gt;Ruby&lt;&#x2F;em&gt; specially with
the borrow checker and static typing. Looking back on my study, I
learned how to breakdown a module into smaller modules, understand
type conversions, create expressive test suites, enhance my editor,
accelerate my Rust compilation and possibly more. It is this larger
scale that demands me to seek improvements. Even though I am guided, I
frequently question and refactor my code sometimes too eagerly.
Whenever or not I finish it, I have already learned so much but I
still want to show my commitment and perseverance.&lt;&#x2F;p&gt;
&lt;p&gt;After months of working on the project, I stopped at chapter 11 or
after implementing &lt;code&gt;rit status&lt;&#x2F;code&gt;. I felt I needed to break the monotony
and work on another task for a while. Although &lt;a href=&quot;https:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt; is a simple and
fine blogging engine, I felt my &lt;a href=&quot;https:&#x2F;&#x2F;orgmode.org&#x2F;&quot;&gt;org-mode&lt;&#x2F;a&gt; workflow could be improved or
simplified with a new engine. &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; is a Rust blogging engine and
alongside &lt;a href=&quot;https:&#x2F;&#x2F;ox-hugo.scripter.co&#x2F;doc&#x2F;why-ox-hugo&#x2F;&quot;&gt;ox-hugo&lt;&#x2F;a&gt; seemed to be a viable workflow. For two weeks or so,
I ported and updated my old site with taxonomies, pagination and
styling. Afterwards, I ported most of my articles with relative ease
while applying the godsend &lt;a href=&quot;https:&#x2F;&#x2F;ox-hugo.scripter.co&#x2F;doc&#x2F;hugo-bundle&#x2F;&quot;&gt;page bundle&lt;&#x2F;a&gt; layout. Another goal was to
move away from &lt;a href=&quot;https:&#x2F;&#x2F;pages.github.com&#x2F;&quot;&gt;GitHub Pages&lt;&#x2F;a&gt; to a self-hosted approach akin to hosting
on a Raspberry Pi. Hosting on &lt;a href=&quot;https:&#x2F;&#x2F;app.netlify.com&#x2F;&quot;&gt;Netlify&lt;&#x2F;a&gt; with manual deploys is a
practical approach for now.&lt;&#x2F;p&gt;
&lt;p&gt;Now with the site reinvigorated, I feel recharged to continue with the
project. I plan to log my experience or findings with this new series
of posts or through other posts while testing this new blogging flow.
With at least 24 chapters or around 500 pages left, hopefully this can
keep in the habit of writing for a long time.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Rust Bit - A Use For Deref Trait</title>
          <pubDate>Sun, 04 Oct 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/wanderer/rust-bit-deref-trait/</link>
          <guid>https://fnlog.dev/wanderer/rust-bit-deref-trait/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I have a toy database module that lazily loads an file-based toy index
with a read, add and commit operation as shown in this snippet:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;PathBuf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DB&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;PathBuf, Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DB &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Index &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; path &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;index.db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_path_buf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; index_data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; index_data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Index &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_slice&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;append&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The challenge is to create an interface where the index can be read by
many or written exclusively like a reference. How about we return a
reference from &lt;code&gt;DB::read_index&lt;&#x2F;code&gt; instead of an owned &lt;code&gt;Index&lt;&#x2F;code&gt;?
Representing that as &lt;code&gt;load_index&lt;&#x2F;code&gt; and &lt;code&gt;lock_index&lt;&#x2F;code&gt; in the following
snippet:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Can we return a reference of an owned object?
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DB &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Index &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; error[E0515]: cannot return reference to temporary value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Index &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; error[E0515]: cannot return reference to temporary value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, this will fail since the owned object is dropped by the end
of the function. What if we create a read-only and write wrapper
structs like &lt;code&gt;IndexRef&lt;&#x2F;code&gt; and &lt;code&gt;IndexRefMut&lt;&#x2F;code&gt; respectively? The read-only
wrapper should only expose immutable methods such as &lt;code&gt;Index::read&lt;&#x2F;code&gt;
while the other exposes everything like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; What if we create a read&#x2F;write interfaces?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRef&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DB &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; IndexRef &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        IndexRef&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        IndexRefMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Immutable Wrapper
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRef &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Mutable Wrapper
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;] {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While it does the job, adding new methods to &lt;code&gt;Index&lt;&#x2F;code&gt; require adding it
to &lt;code&gt;IndexRef&lt;&#x2F;code&gt; and &lt;code&gt;IndexRefMut&lt;&#x2F;code&gt; which is a maintenance issue.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;solution&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#solution&quot; aria-label=&quot;Anchor link for: solution&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Solution&lt;&#x2F;h2&gt;
&lt;p&gt;A trait already exists for this case: &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;ops&#x2F;trait.Deref.html&quot;&gt;std::ops::Deref&lt;&#x2F;a&gt; and
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;ops&#x2F;trait.DerefMut.html&quot;&gt;std::ops::DerefMut&lt;&#x2F;a&gt;. When a method does not exist on an expression, the
compiler will attempt to dereference it until it can find the method.
(See &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;reference&#x2F;expressions&#x2F;method-call-expr.html&quot;&gt;Method Call Expression&lt;&#x2F;a&gt;.) If we allow &lt;code&gt;IndexRef&lt;&#x2F;code&gt; and &lt;code&gt;IndexRefMut&lt;&#x2F;code&gt;
to derefence to &lt;code&gt;Index&lt;&#x2F;code&gt;, we solve the maintenance issue which is
conveyed in the snippet below:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; meaning&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;str = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;42&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Same as below since `&amp;amp;str` automatically derefences to `str`
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Assuming `IndexRef` and `IndexRefMut` implements nothing
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRef &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; write_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; IndexRefMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Since `IndexRefMut::write` does not exist.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; The compiler attempts to derefence `write_index` and hopes to find the `.write` method.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; If `IndexRefMut` derefences to `Index`, it will.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Reading the docs, implementing both traits is straightforward:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Deref &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRef &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Target &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Target &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Deref &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Target &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Target &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;DerefMut &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deref_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Target &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To demonstrate it works:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;index.db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&amp;quot;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; db &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;DB&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; read_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Should be empty data: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{:?}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; write_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    write_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;TOTORO&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    write_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; updated_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Should have data: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;{:?}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; updated_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;&#x2F; Should not be allowed because `db` is already mutably borrowed which is intended
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; read_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Another advantage is that we can implement the &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;ops&#x2F;trait.Drop.html&quot;&gt;std::ops::Drop&lt;&#x2F;a&gt; on
&lt;code&gt;IndexRefMut&lt;&#x2F;code&gt; so that &lt;code&gt;Index::write&lt;&#x2F;code&gt; is called whenever it is dropped
to automatically sync the data. This is also a good separation of
concern to keep &lt;code&gt;Index&lt;&#x2F;code&gt; pure while the wrappers implement convenience
or ergonomics as shown below:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Drop &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;drop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; write_index &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    write_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;TOTORO&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; write_index.write(); &#x2F;&#x2F; Should automatically write when dropped
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although this is a neat trick, it is generally discouraged to
implement &lt;code&gt;Deref&lt;&#x2F;code&gt; as it changes a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;reference&#x2F;expressions&#x2F;operator-expr.html#the-dereference-operator&quot;&gt;well-known behavior&lt;&#x2F;a&gt;. In our case, it
is intentional but do checkout the &lt;a href=&quot;https:&#x2F;&#x2F;rust-lang.github.io&#x2F;api-guidelines&#x2F;predictability.html&quot;&gt;Rust API guidelines&lt;&#x2F;a&gt; for other
things to be aware of.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;wanderer&#x2F;rust-bit-deref-trait&#x2F;code.rs&quot;&gt;Tidbit Code&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes&quot; aria-label=&quot;Anchor link for: notes&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;file-locking&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#file-locking&quot; aria-label=&quot;Anchor link for: file-locking&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
File Locking&lt;&#x2F;h3&gt;
&lt;p&gt;While we preserve the borrow rules, it does not work when multiple
process or threads access the file. We can implement a simple file
locking mechanism where we atomically try to create a file and remove
it when dropping. If another process sees the lock file, then the
lock operation should fail. Instead of using &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;path&#x2F;struct.Path.html#method.exists&quot;&gt;Path::exists&lt;&#x2F;a&gt; then
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;fs&#x2F;fn.write.html&quot;&gt;fs::write&lt;&#x2F;a&gt;, we can do with &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;fs&#x2F;struct.OpenOptions.html&quot;&gt;fs::OpenOptions&lt;&#x2F;a&gt; to do it in one atomic step
and avoid a filesystem &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Race%5Fcondition#Software&quot;&gt;race condition&lt;&#x2F;a&gt;. A simple lock can be amended
to &lt;code&gt;IndexRefMut&lt;&#x2F;code&gt; like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; OpenOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DB &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Index &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;OpenOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;create_new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;index.db.lck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        IndexRefMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Drop &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;drop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;remove_file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;index.db.lck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;is-changed-flag&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#is-changed-flag&quot; aria-label=&quot;Anchor link for: is-changed-flag&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
is_changed Flag&lt;&#x2F;h3&gt;
&lt;p&gt;While syncing the data on drop is nice, it should only sync when data
is changed. We could add an &lt;code&gt;is_changed&lt;&#x2F;code&gt; flag to &lt;code&gt;IndexRefMut&lt;&#x2F;code&gt; so
that it is &lt;code&gt;true&lt;&#x2F;code&gt; whenever &lt;code&gt;Index.add&lt;&#x2F;code&gt; is called and likewise &lt;code&gt;false&lt;&#x2F;code&gt;
for &lt;code&gt;Index.write&lt;&#x2F;code&gt;. It is easily done with:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Index, bool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DB &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        IndexRefMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Drop &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;IndexRefMut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;drop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We could also implement it on &lt;code&gt;Index&lt;&#x2F;code&gt; itself but it is nice that we
can keep &lt;code&gt;Index&lt;&#x2F;code&gt; pure.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;refcell&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#refcell&quot; aria-label=&quot;Anchor link for: refcell&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
RefCell&lt;&#x2F;h3&gt;
&lt;p&gt;It is valid to use a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;cell&#x2F;struct.RefCell.html&quot;&gt;RefCell&lt;&#x2F;a&gt; to store&#x2F;cache the data on load and then
use &lt;code&gt;RefCell.borrow&lt;&#x2F;code&gt; and &lt;code&gt;RefCell.borrow_mut&lt;&#x2F;code&gt; for &lt;code&gt;load_index&lt;&#x2F;code&gt; and
&lt;code&gt;lock_index&lt;&#x2F;code&gt; respectively.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;RefCell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; RefMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DB&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;RefCell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;DB &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;index_cell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; index_cell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;borrow&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;RefCell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;borrow&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;RefMut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;index_cell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; index_cell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;borrow_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;RefCell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read_index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;borrow_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although this works, we are unnecessarily giving away compile time
safety compared to our solution.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>About Me</title>
          <pubDate>Sat, 03 Oct 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/about/</link>
          <guid>https://fnlog.dev/about/</guid>
          <description>&lt;h2 id=&quot;francis-murillo&quot;&gt;Francis Murillo&lt;&#x2F;h2&gt;
&lt;p&gt;I hope you found my articles useful or helpful if you are here. I
started this blog so I can practice writing and contribute meaningful
articles. As a long time &lt;a href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&#x2F;&quot;&gt;Emacs&lt;&#x2F;a&gt; user, I wanted to reflect that in my
design by making one based on my own &lt;em&gt;Emacs&lt;&#x2F;em&gt; theme. Built with &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; and
&lt;a href=&quot;https:&#x2F;&#x2F;orgmode.org&#x2F;&quot;&gt;org-mode&lt;&#x2F;a&gt;, I proudly settled on a workflow and setup that is as simple as
writing a natural org file although the CSS needs work.&lt;&#x2F;p&gt;
&lt;p&gt;Currently, I am a full-time &lt;a href=&quot;https:&#x2F;&#x2F;elixir-lang.org&#x2F;&quot;&gt;Elixir&lt;&#x2F;a&gt; developer for a small blockchain
company proving and promoting its value. With my spare time, I study and
dabble in &lt;a href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&#x2F;&quot;&gt;Rust&lt;&#x2F;a&gt; to get back to my roots as a frustrated mathematician or
computer scientist. Other than that, I am a cat person, loves artistic
movies, challenging video games, and well written cartoons.&lt;&#x2F;p&gt;
&lt;p&gt;Nonetheless, thank you for reading any of my articles and hope to
produce more quality writing in the future.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Outer Wilds - On Acceptance</title>
          <pubDate>Sun, 22 Mar 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/gamer/outer-wilds-on-acceptance/</link>
          <guid>https://fnlog.dev/gamer/outer-wilds-on-acceptance/</guid>
          <description>&lt;h2 id=&quot;outer-wilds&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#outer-wilds&quot; aria-label=&quot;Anchor link for: outer-wilds&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Outer Wilds&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;www.outerwilds.com&#x2F;&quot;&gt;Outer Wilds&lt;&#x2F;a&gt; is a space exploration game where you launch your tiny
rocket and explore various planets to uncover the mysteries of the
galaxy. The game has a remarkable physics engine where flying in space
with an astronaut suit or the ship feels kinesthetically pleasing. Above
all, the game is artistic and meaningful with its overall message and
gameplay. It nails its theme of discovery and exploration by giving the
player all the tools upfront and not guiding the player in their journey
which is a rarity. Although the game is not for everyone specially who
are susceptible to motion sickness, this game deserves to be played and
experienced.&lt;&#x2F;p&gt;
&lt;p&gt;While the game is primarily about the joy of space exploration, the game
resonated with me differently. During my first playthrough, I launched
into space and delightfully agonized which planet to explore. Little did
I know, I first choose and crashed into the sea of the green planet,
&lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.gamepedia.com&#x2F;Giant%27s%5FDeep&quot;&gt;Giant&#x27;s Deep&lt;&#x2F;a&gt;, then trying to find safety in land among the strong
cyclones and ocean currents. Wherever I escaped to next after some time
exploring, I heard an audio cue that lasted for a minute; then, the Sun
collapsed onto itself and transformed to a bright blue supernova slowly
consuming everything. I stood fixated in awe, took a deep breath and
kept my eyes open.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;gamer&#x2F;outer-wilds-on-acceptance&#x2F;supernova.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Death did not take me but was instead sent back in time right after the
start of the game. Why did the Sun explode? Why is the player sent back
in time when it does? Can this supernova be stopped or the home planet
saved? While the player is free to roam the galaxy, the Sun&#x27;s time limit
forces numerous and unavoidable deaths which is heightened through the
first person view&#x2F;experience. Over time, the player accepts death as a
natural part of the game, not simply an error&#x2F;failure state that they
need to respawn or reload state.&lt;&#x2F;p&gt;
&lt;p&gt;While most players will solve this unpleasant mystery in the hopes of
saving the galaxy, perhaps the opposite is also a valid response. Death
should instinctively be avoided; however, the game with its technical
and spatial boundary does not let the player run away. It forces the
player to face it, yet it is not a painful experience. Neither a
tragedy nor conflict but the natural end of the solar system. To behold
that beautiful and radiant moment feels both religious and peaceful.&lt;&#x2F;p&gt;
&lt;p&gt;All this emotion was drawn out in the first loop, such a game is a rare
and personal gem. Whether players or readers felt differently, this game
not just invokes the fear of death, but also its acceptance through its
story and message that I want to discuss. To be clear, life and time is
precious and being more open to its end is a valuable insight.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;SPOILERS AHEAD&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;acceptance&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#acceptance&quot; aria-label=&quot;Anchor link for: acceptance&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Acceptance&lt;&#x2F;h2&gt;
&lt;p&gt;To answer why the Sun is dying, the alien technology and knowledge left
behind the precursor race, &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.gamepedia.com&#x2F;Nomai&quot;&gt;Nomai&lt;&#x2F;a&gt;, may lead to it. Indeed, our newly
graduated &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.gamepedia.com&#x2F;Hearthian&quot;&gt;Heartian&lt;&#x2F;a&gt; astronaut protagonist is the only one equipped to
translate their language and thus understand their legacy. As the player
uncovers more about them and &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.gamepedia.com&#x2F;Ash%5FTwin%5FProject&quot;&gt;Ash Twin Project&lt;&#x2F;a&gt;, it is found the &lt;em&gt;Nomai&lt;&#x2F;em&gt;
does not have a clear answer themselves. While other &lt;em&gt;Nomai&lt;&#x2F;em&gt; clans
exists, the ones that found themselves in the &lt;em&gt;Hearthian&lt;&#x2F;em&gt; galaxy
followed a signal older than universe itself known as &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.gamepedia.com&#x2F;Eye%5Fof%5Fthe%5FUniverse&quot;&gt;Eye of the
Universe&lt;&#x2F;a&gt;. The incidental time loop and surviving technology were all in
service of finding this elusive origin. Even if the player discovers a
way to travel to it which is intended endpoint of the game, the player
is no closer to stopping the threat. In fact, the &lt;em&gt;Nomai&lt;&#x2F;em&gt; would escape
themselves and leave the danger behind once they found the coordinates.
Although the &lt;em&gt;Nomai&lt;&#x2F;em&gt; tried and failed to force the Sun to explode as a
power source, the Sun is simply at the end of its life.&lt;&#x2F;p&gt;
&lt;p&gt;If the &lt;em&gt;Nomai&lt;&#x2F;em&gt; do not have answers or powers to avert the crisis, what
then can stop the death of a solar system? Should the player place their
hope in the unknown &lt;em&gt;Eye of the Universe&lt;&#x2F;em&gt; can offer? Rather, if
something is naturally meant to die, do we have the right to prevent it
from doing so? The Sun is dying and the &lt;em&gt;Hearthians&lt;&#x2F;em&gt; should have been
evacuated if there was more time. The Sun will die, the &lt;em&gt;Hearthians&lt;&#x2F;em&gt;
will follow and so will the player character. One could read despair and
defeat, but perhaps the game is about accepting the inevitable or that
not all things can be saved.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;gamer&#x2F;outer-wilds-on-acceptance&#x2F;eye-of-the-universe.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;As a final hope, when the player arrives at &lt;em&gt;Eye of the Universe&lt;&#x2F;em&gt;, the
Sun is far beyond the stars and possibly beyond danger. Inside however,
it is revealed that other solar systems or galaxies are dying indicating
the death of the universe, not just of the player&#x27;s solar system. At the
end of the universe, the game lets the player sit by a campfire and
listen to the main theme as the new universe comes into light. To
emphasize, although the solar system collapses and the player dies which
contradicts the expectation of a lone hero or survivor, the universe and
life will eventually find a way. Death is not the end.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;gamer&#x2F;outer-wilds-on-acceptance&#x2F;new-universe.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;In light of the ending, the signal that is older than the universe or
the &lt;em&gt;Eye of the Universe&lt;&#x2F;em&gt; itself becomes interesting. The universe has
been possibly recreated several times and each time an observer sent
waves of harmony for the succeeding generation to remember and
ultimately find as the &lt;em&gt;Nomai&lt;&#x2F;em&gt; and &lt;em&gt;Hearthian&lt;&#x2F;em&gt; did together. If so and
one thinks of the time loop as a hindrance to one&#x27;s personal or
emotional well-being, then it could be read as overcoming depression,
anxiety, pain, suffering and so on. As a personal reading, inescapable
and perpetual deaths tap into my anxieties and stopping the loop is
overcoming it; finishing the game becomes a therapeutic experience.&lt;&#x2F;p&gt;
&lt;p&gt;Related to that is &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.gamepedia.com&#x2F;Gabbro&quot;&gt;Gabbro&lt;&#x2F;a&gt; who is the most relaxed &lt;a href=&quot;https:&#x2F;&#x2F;outerwilds.gamepedia.com&#x2F;Outer%5FWilds%5FVentures&quot;&gt;Outer Wilds Venture&lt;&#x2F;a&gt;
member and more importantly also experiences the time loop like the
protagonist. Unlike the expected player, he is at peace with the
impending doom and even teaches the player to meditate through it which
is represented by the &lt;em&gt;Meditate Until Next Loop&lt;&#x2F;em&gt; option in the pause
screen. Happily surrendering to the next loop seems to be a form of
suicide without this option. If one needed to end the loop prematurely,
suicide by suffocating or crashing seems a viable strategy. With this
option however, it is not framed as such but instead as a calm
acceptance. Like with the other members though, he does not act on it
and lounges around making his peace as a lazy surrender than an
enlightenment. Still, his relaxed demeanor and personality contrasts the
player&#x27;s anxieties.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;gamer&#x2F;outer-wilds-on-acceptance&#x2F;meditate-option.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Between the &lt;em&gt;Hearthian&lt;&#x2F;em&gt; explorers and &lt;em&gt;Nomai&lt;&#x2F;em&gt; thinkers, by making the
player embody the travelers spirit in this time loop, the focus shifts
on exploring the world for an answer than inventing one. Given the short
duration of the loop, knowledge and experience may seem futile but each
bit in each iteration add up. For a &lt;em&gt;Hearthian&lt;&#x2F;em&gt; specially, each loop is
a journey, each journey a precious experience. One last slight reach for
the ending, it is the &lt;em&gt;Nomai&lt;&#x2F;em&gt; who are thankful for the journey while
playing around a campfire as the new universe comes to life. If the
&lt;em&gt;Nomai&lt;&#x2F;em&gt; knew &lt;em&gt;Eye of the Universe&lt;&#x2F;em&gt; would lead them to the end, would
they have been so obsessed in chasing it across the stars? As an
&lt;em&gt;Hearthian&lt;&#x2F;em&gt;, the journey to the end of the world is romantic.&lt;&#x2F;p&gt;
&lt;p&gt;The strongest support for the theme comes with the loop itself. Making
the loop a repeated short cycle instead of a looming deadline is a
brilliant decision for the feeling and message. If it were a long
deadline or cycle, the feel and weight of death diminishes the longer it
looms in the distance. By being constantly reminded of the destruction
and impact of the end, it feels closer and personal how much it holds
the player. By making sure the player experiences it once, the white
explosion at the end contextualizes the Sun&#x27;s nova. In changing the
scope and scale, as the loop ends for the player, a new loop begins for
the universe.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;gamer&#x2F;outer-wilds-on-acceptance&#x2F;white-nova.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;In simple ways, it is amazing how naturally this game taps into
anxieties of death. Other points can be made about the game such as the
physics, ships, planets, &lt;em&gt;Nomai&lt;&#x2F;em&gt; race, &lt;em&gt;Hearthian&lt;&#x2F;em&gt; explorer,
instruments, quantum objects, ethics and so on; but above all through
its restraint and commitment, it was able to deliver a meaningful and
positive experience for me and hopefully other players as well. What
more can you ask of a game?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Elixir Musing - GraphQL Over A Message Queue</title>
          <pubDate>Mon, 17 Feb 2020 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/elixir-musing-graphql-over-a-message-queue/</link>
          <guid>https://fnlog.dev/dev/elixir-musing-graphql-over-a-message-queue/</guid>
          <description>&lt;h2 id=&quot;introspection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#introspection&quot; aria-label=&quot;Anchor link for: introspection&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Introspection&lt;&#x2F;h2&gt;
&lt;p&gt;After releasing an &lt;a href=&quot;https:&#x2F;&#x2F;elixir-lang.org&#x2F;&quot;&gt;Elixir&lt;&#x2F;a&gt; project to production, it is time for
introspection. Context, the project uses a microservice architecture
over a &lt;a href=&quot;https:&#x2F;&#x2F;nsq.io&#x2F;&quot;&gt;nsq&lt;&#x2F;a&gt; message queue where each service is mostly an umbrella
&lt;a href=&quot;https:&#x2F;&#x2F;www.phoenixframework.org&#x2F;&quot;&gt;phoenix&lt;&#x2F;a&gt; app that offers a GraphQL interface via &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;absinthe-graphql&#x2F;absinthe&quot;&gt;absinthe&lt;&#x2F;a&gt;. While I am
happy with the language and GraphQL in general, I am not a fan of the
complexity that microservices implied. Grievances aside, among the many
lessons and insights earned, one of them was worth some research.&lt;&#x2F;p&gt;
&lt;p&gt;The choice for using &lt;code&gt;nsq&lt;&#x2F;code&gt; over &lt;a href=&quot;https:&#x2F;&#x2F;www.rabbitmq.com&#x2F;&quot;&gt;rabbitmq&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;kafka.apache.org&#x2F;&quot;&gt;kafka&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;zeromq.org&#x2F;&quot;&gt;zeromq&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;nats.io&#x2F;&quot;&gt;nats&lt;&#x2F;a&gt; was
primarily its lightweight nature because of the project&#x27;s small
messaging requirement. With an offbeat decision, does &lt;code&gt;nsq&lt;&#x2F;code&gt; have
language support? Thankfully, it does with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wistia&#x2F;elixir%5Fnsq&quot;&gt;elixir_nsq&lt;&#x2F;a&gt; but using it
directly is clunky for an standard application. Good news, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;conduitframework&#x2F;conduit&quot;&gt;conduit&lt;&#x2F;a&gt; is an
library for abstracting message queues inspired by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;elixir-plug&#x2F;plug&quot;&gt;plug&lt;&#x2F;a&gt; that looks nice.
Bad news, it does not support &lt;code&gt;nsq&lt;&#x2F;code&gt;. After much time and thought, the
best plan was to stick with &lt;code&gt;conduit&lt;&#x2F;code&gt; and attempt to write an adapter
library. If the venture failed, the popular &lt;code&gt;rabbitmq&lt;&#x2F;code&gt; is always a
fallback. Thankfully, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DigixGlobal&#x2F;conduit%5Fnsq&quot;&gt;conduit_nsq&lt;&#x2F;a&gt; was born and thus &lt;code&gt;nsq&lt;&#x2F;code&gt; stays.&lt;&#x2F;p&gt;
&lt;p&gt;Reviewing the workflow, so when one service needs something from
another, the following steps are taken:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Pick a topic say &lt;code&gt;product&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Create a handler for &lt;code&gt;product_request&lt;&#x2F;code&gt; in the responding
service.&lt;&#x2F;li&gt;
&lt;li&gt;Implement the domain method for that handler&lt;&#x2F;li&gt;
&lt;li&gt;Implement a blocking method that publishes &lt;code&gt;product_request&lt;&#x2F;code&gt; and
waits for &lt;code&gt;product_response&lt;&#x2F;code&gt; in the asking service&lt;&#x2F;li&gt;
&lt;li&gt;Create a handler for waiting on &lt;code&gt;product_response&lt;&#x2F;code&gt; and pass the
data to unblock the method&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Below is a simplified snippet of the changes needed. (Feel free to skim
it and get a general understanding of the structure and form)&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# responder&#x2F;broker.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;configure &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  queue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;incoming &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Receiver &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ProductRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;responder&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;outgoing &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# responder&#x2F;product_request.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Responder&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ProductRequest &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Subscriber
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    types &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; types&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;types&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;validate_required&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;types&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;valid?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; changeset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply_changes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Responder&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Products&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_by_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        _ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Responder&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Broker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# receiver&#x2F;broker.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;configure &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  queue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;incoming &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Receiver &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ProductResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;receiver&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;outgoing &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# receiver&#x2F;client.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Receiver&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Client &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_product_by_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    correlation_id &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;UUID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;generate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Receiver&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;get_product_by_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Broker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    product &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= receive do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;after
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;timer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;seconds&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unregister&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Receiver&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    product
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# receiver&#x2F;product_response.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Receiver&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ProductResponse &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Subscriber
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    types &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;price&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;float&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; types&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;types&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;validate_required&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;types&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;valid?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; changeset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           product &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply_changes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;case &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lookup&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Receiver&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Client&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pid&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;get_product_by_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}] &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               send&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pid&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             _ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         _ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The code above is functional and works; however, I do have some
concerns:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Unstructured Data&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Before using the message body, it has to be casted and validated from a
string map into an atom map. The team standard is to treat string maps
as unstructured or unsafe data before being used or pattern matched even
if it comes from the queue but is still boilerplate.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Broker Setup&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Setting up the topics and identical routes is error prone if not
careful. Being confused with the topics used in receiver or handler is
not a rare occurrence which led to some self-loathing.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Request&#x2F;Response Boilerplate&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Creating two small modules for new service interactions seems menial.
Not to say that it does not make sense just that creating multiple tiny
files adds up and is a maintenance cost.&lt;&#x2F;p&gt;
&lt;p&gt;Rather, what this reminds me is the comparison between GraphQL and REST.
I am not here to argue their merits but I favor GraphQL for establishing
a typed contract between the consumer and provider. The problems above
can be solved if GraphQL can work with a message queue transport.
Fascinating, can it be done?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;NOTE:&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; Other communication library or technologies exist such as &lt;a href=&quot;https:&#x2F;&#x2F;grpc.io&#x2F;&quot;&gt;grpc&lt;&#x2F;a&gt;
or &lt;a href=&quot;https:&#x2F;&#x2F;thrift.apache.org&#x2F;&quot;&gt;thrift&lt;&#x2F;a&gt; to solve the problem; however, this increases the technology
stack which is exciting but a risk. While this exercise or idea may not
be the most efficient for the task, it works within the constraints and
serves as a different perspective of GraphQL.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;proof-of-concept&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#proof-of-concept&quot; aria-label=&quot;Anchor link for: proof-of-concept&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Proof Of Concept&lt;&#x2F;h2&gt;
&lt;p&gt;Programmers are optimistic so whether it can be done is yes if not a
matter of time; however more than the binary answer, our concern is how
does this style or design affect productivity, stability or efficiency
of a project. To test this idea, we will be creating a sandbox project
with four services for a hypothetical product API:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Accounts Service&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; - Holds user data&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Products Service&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; - Stores product data&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Transactions Service&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; - Contains the transactions made by a user&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;API Gateway&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; - The main GraphQL interface for integrating the
services&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The quick sketch of the operations and interactions are:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;A user will register through the &lt;code&gt;registerUser&lt;&#x2F;code&gt; mutation via the
account service&lt;&#x2F;li&gt;
&lt;li&gt;That user can look at the available products at &lt;code&gt;products&lt;&#x2F;code&gt; query via
product service&lt;&#x2F;li&gt;
&lt;li&gt;The user can pick several products by id and use the
&lt;code&gt;createTransaction&lt;&#x2F;code&gt; mutation via the transactions service. To make
this interesting, this calls the product service to fetch the current
price of goods.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;In building the project, I took the following steps:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Create the account service and &lt;code&gt;users&lt;&#x2F;code&gt; query&lt;&#x2F;li&gt;
&lt;li&gt;Build the gateway and connect to the other service&lt;&#x2F;li&gt;
&lt;li&gt;Implement and expose the &lt;code&gt;registerUser&lt;&#x2F;code&gt; mutation&lt;&#x2F;li&gt;
&lt;li&gt;Create the product service, the &lt;code&gt;products&lt;&#x2F;code&gt; query, and integrate with
it the gateway&lt;&#x2F;li&gt;
&lt;li&gt;Implement the &lt;code&gt;createTransaction&lt;&#x2F;code&gt; mutation&lt;&#x2F;li&gt;
&lt;li&gt;Add &lt;code&gt;User.transactions&lt;&#x2F;code&gt; field&lt;&#x2F;li&gt;
&lt;li&gt;Add GraphiQL to each service&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;You can follow along or checkout the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;graphql%5Fover%5Fnsq&quot;&gt;working code&lt;&#x2F;a&gt; and try it out for
yourself which uses &lt;a href=&quot;https:&#x2F;&#x2F;duckduckgo.com&#x2F;?t=ffab&amp;amp;q=docker-compose&amp;amp;ia=web&quot;&gt;docker-compose&lt;&#x2F;a&gt; for ease. Nonetheless, I will be
working through the design and implementation process starting with the
basic account service.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;NOTE:&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; I will only show relevant code in building the research.
Things like the migrations, changesets or domain functions will pad the
article and is not that interesting. I also assume you are familiar with
implementing your own &lt;code&gt;absinthe&lt;&#x2F;code&gt; and &lt;code&gt;phoenix&lt;&#x2F;code&gt; GraphQL API; however, I
will not assume you know &lt;code&gt;conduit&lt;&#x2F;code&gt; or &lt;code&gt;nsq&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;account-service&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#account-service&quot; aria-label=&quot;Anchor link for: account-service&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Account Service&lt;&#x2F;h2&gt;
&lt;p&gt;Our initial objective is to setup the account service which can be
easily setup via &lt;code&gt;mix new --sup account_service&lt;&#x2F;code&gt;. We then set up the
following:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;elixir-ecto&#x2F;ecto&quot;&gt;ecto&lt;&#x2F;a&gt; with &lt;a href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;&quot;&gt;postgresql&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We need a database or storage to store the users.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;sudo systemctl start postgresql   # Assuming a standard postgres
&lt;&#x2F;span&gt;&lt;span&gt;sudo -u postgres -i
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;createuser -d -P mq_user          # Enter passwod: mq_pass
&lt;&#x2F;span&gt;&lt;span&gt;createdb mq_db -O mq_user
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;account_service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Repo&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;username&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mq_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;password&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mq_pass&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;database&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;mq_db&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;hostname&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;localhost&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;port&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5432&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;show_sensitive_data_on_connection_error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;pool_size&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While I could have used an &lt;code&gt;Agent&lt;&#x2F;code&gt;, I wanted to simulate changeset
errors when doing mutation testing.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;conduitframework&#x2F;conduit&quot;&gt;conduit&lt;&#x2F;a&gt; with &lt;a href=&quot;https:&#x2F;&#x2F;nsq.io&#x2F;components&#x2F;nsqd.html&quot;&gt;nsqd&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We need a running &lt;code&gt;nsqd&lt;&#x2F;code&gt; at port &lt;code&gt;14150&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;nsqd --tcp-address=0.0.0.0:14150 --http-address=0.0.0.0:14151
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While you can use the default port &lt;code&gt;4150&lt;&#x2F;code&gt;, I prefer to run them in a
different port in every project.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;account_service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Broker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;adapter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ConduitNSQ&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;producer_nsqds&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;localhost:14150&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;nsqds&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;localhost:14150&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Setting up the &lt;code&gt;broker.ex&lt;&#x2F;code&gt; with a JSON parsing is easy to setup:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# account_service&#x2F;broker.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Broker &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Broker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;otp_app&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;account_service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;channel &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;account_service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  pipeline &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;serialize &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Wrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Encode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;content_encoding&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  pipeline &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;deserialize &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Decode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;content_encoding&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# config.exs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Encoding&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, [
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Custom JSON encoding to use Jason
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;absinthe-graphql&#x2F;absinthe&quot;&gt;absinthe&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Personally, it feels strange install &lt;code&gt;absinthe&lt;&#x2F;code&gt; without &lt;code&gt;phoenix&lt;&#x2F;code&gt; or
&lt;code&gt;plug&lt;&#x2F;code&gt; but we will install them near the end.&lt;&#x2F;p&gt;
&lt;p&gt;With a fresh &lt;code&gt;schema.ex&lt;&#x2F;code&gt;, we can start with our &lt;code&gt;User&lt;&#x2F;code&gt; type and &lt;code&gt;users&lt;&#x2F;code&gt; query:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# account_service&#x2F;schema.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;object &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;user &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;User of this wonderful platform&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;User ID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;User email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;first_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;User first name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;last_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;User last name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;query &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list_of&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_users&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()}   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# Basically Repo.all(User)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The corresponding &lt;code&gt;user.ex&lt;&#x2F;code&gt; schema and migration easily follows from
that. To check if its all fired up:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;mix do ecto.drop, ecto.setup    # ecto.setup = [ecto.create, ecto.migrate, ecto.seed]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;iex -S mix run --no-halt
&lt;&#x2F;span&gt;&lt;span&gt;iex&amp;gt; AccountService.Repo.all(AccountService.User)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;absinthe-via-conduit&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#absinthe-via-conduit&quot; aria-label=&quot;Anchor link for: absinthe-via-conduit&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Absinthe via Conduit&lt;&#x2F;h2&gt;
&lt;p&gt;Taking our cue from the motivation, we will expose a request and
response topic:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# account_service&#x2F;broker.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;configure &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  queue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;account_graphql_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;incoming &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  pipe_through&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;([:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;deserialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;])
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;graphql_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GraphQLRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;account_graphql_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;outgoing &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  pipe_through&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;([:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;serialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;])
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;graphql_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;account_graphql_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Working through the snippet above, we receive on the
&lt;code&gt;account_graphql_request&lt;&#x2F;code&gt; topic and send on the
&lt;code&gt;account_graphql_response&lt;&#x2F;code&gt; topic as our convention. More importantly,
the request handler module is &lt;code&gt;AccountService.GraphQLRequest&lt;&#x2F;code&gt; where the
magic happens:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GraphQLRequest &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Subscriber
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    types &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;variables&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; types&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;types&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;validate_required&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;([:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;])
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;valid?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; changeset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply_changes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;changeset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           query &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fetch!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           variables &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;variables&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           context &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;           # NEXT: What to do here?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         changeset &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    # Need to return the message to mark it as acknowledged
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So for every message, we assume it has a payload&#x2F;body of a string map
with a required &lt;code&gt;query&lt;&#x2F;code&gt; string and optional &lt;code&gt;variables&lt;&#x2F;code&gt; and &lt;code&gt;context&lt;&#x2F;code&gt;
map. With an &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;ecto&#x2F;Ecto.Changeset.html#module-schemaless-changesets&quot;&gt;schemaless changeset&lt;&#x2F;a&gt;, those fields are easily extracted. We
also require it to have a &lt;code&gt;correlation_id&lt;&#x2F;code&gt; to have a way to return it to
the sender.&lt;&#x2F;p&gt;
&lt;p&gt;Browsing around the &lt;code&gt;absinthe&lt;&#x2F;code&gt; documentation, I found &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;absinthe&#x2F;Absinthe.html#run&#x2F;3&quot;&gt;Absinthe.run&lt;&#x2F;a&gt; and
quickly capitalized:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Schema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;variables&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; variables&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Excellent, we just need to return the data back which is easily done:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Broker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;graphql_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# The topic ID in broker.ex, not the topic itself
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Testing it out, we run &lt;code&gt;mix run --no-halt&lt;&#x2F;code&gt; again and use the logging
commands &lt;code&gt;nsq_tail&lt;&#x2F;code&gt; to watch any messages being published in the GraphQL
topics:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# In one terminal
&lt;&#x2F;span&gt;&lt;span&gt;nsq_tail --nsqd-tcp-address=0.0.0.0:14150 --topic=account_graphql_request
&lt;&#x2F;span&gt;&lt;span&gt;# In another terminal
&lt;&#x2F;span&gt;&lt;span&gt;nsq_tail --nsqd-tcp-address=0.0.0.0:14150 --topic=account_graphql_response
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once the listeners are in place, we can &lt;code&gt;curl&lt;&#x2F;code&gt; the HTTP &lt;a href=&quot;https:&#x2F;&#x2F;nsq.io&#x2F;components&#x2F;nsqd.html#post-pub&quot;&gt;publish&lt;&#x2F;a&gt; endpoint
with this JSON payload to simulate a call:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;query { users { email firstName lastName } }&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;fields&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ABC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;curl -i -H Content-Type\:\ application&#x2F;json -XPOST http\:&#x2F;&#x2F;localhost\:14151&#x2F;pub\?topic\=account_graphql_request -d \{\&amp;quot;body\&amp;quot;\:\ \{\&amp;quot;query\&amp;quot;\:\&amp;quot;query\ \{\ users\ \{\ email\ firstName\ lastName\ \}\ \}\&amp;quot;\,\ \&amp;quot;variables\&amp;quot;\:\ \{\&amp;quot;a\&amp;quot;\:\ 1\}\}\,\ \&amp;quot;fields\&amp;quot;\:\ \{\&amp;quot;correlation_id\&amp;quot;\:\ 1\}\,\ \&amp;quot;headers\&amp;quot;\:\ \{\}\}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The extra fields and wrapping of the &lt;code&gt;query&lt;&#x2F;code&gt; field is because of the
JSON encoding pipeline in &lt;code&gt;Broker&lt;&#x2F;code&gt; which is also the way to set a
header&#x2F;meta field such as &lt;code&gt;correlation_id&lt;&#x2F;code&gt; in the message itself. More
importantly, a snippet from the output of &lt;code&gt;account_graphql_response&lt;&#x2F;code&gt;
proves that it works.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;hollie.ullrich@towne.net&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;firstName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;OSCAR&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lastName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MAX&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;kaitlin2094@gutkowski.biz&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;firstName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;POPPY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lastName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MAX&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;marjolaine2098@lowe.org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;firstName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;LILY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lastName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;DAISY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;emelia_mosciski@balistreri.info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;firstName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;JASPER&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lastName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;MAX&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;arnoldo.stehr@herzog.info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;firstName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;LILY&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lastName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;SHADOW&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;fields&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ABC&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;destination&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;graphql_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;headers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;null
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;api-gateway&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#api-gateway&quot; aria-label=&quot;Anchor link for: api-gateway&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
API Gateway&lt;&#x2F;h2&gt;
&lt;p&gt;With account service ready to accept GraphQL queries via message queue,
we now set up the gateway to connect our new services. We create our
&lt;code&gt;phoenix&lt;&#x2F;code&gt; app via &lt;code&gt;phx.new&lt;&#x2F;code&gt; with the barest of options:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;mix phx.new api_gateway --no-ecto --no-html --no-gettext --no-webpack
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Similar to account service, we install &lt;code&gt;conduit&lt;&#x2F;code&gt; and &lt;code&gt;absinthe&lt;&#x2F;code&gt; but with
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;absinthe-graphql&#x2F;absinthe%5Fplug&quot;&gt;absinthe_plug&lt;&#x2F;a&gt; this time:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway_web&#x2F;router.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;scope &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  pipe_through &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;api
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  forward &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;graphql&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;schema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ApiGateway&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Schema
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  forward &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;graphiql&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GraphiQL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;schema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ApiGateway&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Schema
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The setup for the broker is similar as well:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway.broker.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;channel &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;api_gateway&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;configure &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  queue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;account_graphql_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;incoming &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ApiGateway &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  pipe_through&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;([:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;deserialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;])
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;account_graphql_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountGraphQLResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;account_graphql_response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;outgoing &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  pipe_through&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;([:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;serialize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;])
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;account_graphql_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;account_graphql_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We then copy the &lt;code&gt;User&lt;&#x2F;code&gt; type and &lt;code&gt;users&lt;&#x2F;code&gt; query but this we need to
resolve it by calling the GraphQL interface of accounts service:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway&#x2F;schema.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;field &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list_of&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    # NEXT: What to do here?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We wrap this functionality in a client similar to the motivating
example:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway&#x2F;account_client.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ApiGateway&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountClient &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; variables &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;, context &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    request_id &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Ecto&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;UUID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;uuid4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;register&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; request_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;graphql&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    result &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_correlation_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conduit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;variables&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; variables&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ApiGateway&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Broker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;account_graphql_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;receive do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               response &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;after
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;timer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;seconds&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;15&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;response_timeout&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unregister&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;registry&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; request_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To call the account service &lt;code&gt;users&lt;&#x2F;code&gt; query in the resolver:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway&#x2F;schema.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountClient&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;query {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  users {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    email
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    firstName
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    lastName
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; users&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; users&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Notice the naming convention in the query or GraphQL in general is
&lt;code&gt;camelCase&lt;&#x2F;code&gt; while for Elixir it is &lt;code&gt;under_scored&lt;&#x2F;code&gt;. The issue is that
&lt;code&gt;absinthe&lt;&#x2F;code&gt; expects the data to be in &lt;code&gt;under_score&lt;&#x2F;code&gt; and converts it into
&lt;code&gt;camelCase&lt;&#x2F;code&gt;. So when we use the query above, &lt;code&gt;first_name&lt;&#x2F;code&gt; since it
receives &lt;code&gt;firstName&lt;&#x2F;code&gt;. As a quick fix, we can convert the data received
from the response via &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ruby2elixir&#x2F;atomic%5Fmap&quot;&gt;atomic_map&lt;&#x2F;a&gt; or create a middleware to do the same.
Either fix is converting converted data which seems inefficient, instead
vwe can tell &lt;code&gt;absinthe&lt;&#x2F;code&gt; to retain the &lt;code&gt;under_score&lt;&#x2F;code&gt; convention by setting
the adapter to &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;absinthe&#x2F;Absinthe.Adapter.Passthrough.html&quot;&gt;Absinthe.Adapter.Passthrough&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# account_service&#x2F;config&#x2F;config.exs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;adapter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Adapter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Passthrough
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway&#x2F;schema.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;query {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  users {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    email
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    first_name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    last_name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is also useful when other services need to communicate with each
other later on. Within the internal network or system, the convention is
&lt;code&gt;under_score&lt;&#x2F;code&gt;; when it leaves the gateway, it becomes &lt;code&gt;camelCase&lt;&#x2F;code&gt;. One
more thing remains before it completely works, the response from a
GraphQL endpoint is a string map and by default &lt;code&gt;absinthe&lt;&#x2F;code&gt; only picks up
atom keys. So even with the correct keys, we need to tell &lt;code&gt;absinthe&lt;&#x2F;code&gt; to
pick up both atom and string keys. Taking cues from the &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;absinthe&#x2F;Absinthe.Middleware.html#module-default-middleware&quot;&gt;default
middleware guide&lt;&#x2F;a&gt;, we can change the default middleware to check for
both:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway&#x2F;schema.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;middleware&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;middleware&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;identifier&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; identifier&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; object&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  field_name &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Atom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;identifier&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  new_middleware_spec &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;__MODULE__&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;get_field_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}, {&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;field_name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; identifier&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Schema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace_default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;middleware&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_middleware_spec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; object&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_field_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Resolution&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, {&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fallback_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  new_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;case &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fetch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fallback_key&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;res &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;resolved&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;All pieces are now in place and we can use the GraphiQL
endpoint(&lt;a href=&quot;http:&#x2F;&#x2F;localhost:14000&#x2F;graphiql&quot;&gt;http:&#x2F;&#x2F;localhost:14000&#x2F;graphiql&lt;&#x2F;a&gt;) to check our work. Running the
original query above leads to the same result as the account service.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;registeruser-mutation&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#registeruser-mutation&quot; aria-label=&quot;Anchor link for: registeruser-mutation&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
registerUser Mutation&lt;&#x2F;h2&gt;
&lt;p&gt;With a working query, we can test mutations with a new &lt;code&gt;registerUser&lt;&#x2F;code&gt;
mutation which should look like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;graphql&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-graphql &quot;&gt;&lt;code class=&quot;language-graphql&quot; data-lang=&quot;graphql&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mutation&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;($&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, $&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;firstName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, $&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;lastName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;String!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;register_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: $&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;email
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      firstName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: $&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;firstName
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      lastName&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: $&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lastName
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;errors &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;field
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;user &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;email
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;firstName
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;lastName
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from using &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;absinthe-graphql&#x2F;absinthe%5Frelay&quot;&gt;absinthe_relay&lt;&#x2F;a&gt;, creating the whole vertical slice for
the mutation from the account service to the gateway is straightforward.
Calling a mutation and passing the arguments from one endpoint to
another is surprisingly clear:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway&#x2F;schema.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountClient&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    mutation($email: String!, $first_name: String!, $last_name: String!) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      register_user(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        input: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          email: $email
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          first_name: $first_name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          last_name: $last_name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      ) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        errors {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          field
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        user {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          email
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          first_name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          last_name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    args       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# HERE: Passing arguments
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;register_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; register_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; register_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Going back the reason we used a database instead of an &lt;code&gt;Agent&lt;&#x2F;code&gt; is to
test concurrency errors specially when two instances of the same service
receives the same request. Thanks to &lt;code&gt;ecto&lt;&#x2F;code&gt;, I am confident that this
cannot happen because of the unique database index; however, what if the
operation has no index like with the upcoming &lt;code&gt;createTransaction&lt;&#x2F;code&gt;
mutation? Our message queue also has our back with this because when two
or more clients subscribe to the same topic but all the same channel,
only one gets it (see &lt;a href=&quot;https:&#x2F;&#x2F;nsq.io&#x2F;overview&#x2F;design.html&quot;&gt;NSQ Design&lt;&#x2F;a&gt;); however, messages can be still
delivered many times (see &lt;a href=&quot;https:&#x2F;&#x2F;nsq.io&#x2F;overview&#x2F;features%5Fand%5Fguarantees.html#messages-are-delivered-at-least-once&quot;&gt;NSQ Guarantees&lt;&#x2F;a&gt;) so we are back where we
started. Message deduplication is beyond the scope of this
investigation. (&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DigixGlobal&#x2F;conduit%5Fplugs#conduitplugsdeduplication&quot;&gt;ConduitPlugs.Deduplication&lt;&#x2F;a&gt; is my quick stab at that.)&lt;&#x2F;p&gt;
&lt;p&gt;I have another concern but that is down the road and we can move on for
now. If you do want to simulate the issue above, you can do the
following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# account_service&#x2F;broker.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# If you want to have different channels for every run,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# replace channel with a random value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;subscribe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;graphql_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GraphQLRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;topic&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;account_graphql_request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &amp;quot;#{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;channel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Enum&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;random&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;100&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)}&amp;quot;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# HERE: From @channel
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# In one terminal
&lt;&#x2F;span&gt;&lt;span&gt;mix run --no-halt
&lt;&#x2F;span&gt;&lt;span&gt;# In another terminal
&lt;&#x2F;span&gt;&lt;span&gt;mix run --no-halt
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# With docker
&lt;&#x2F;span&gt;&lt;span&gt;docker-compose up --scale account_service=2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;product-and-transaction-service&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#product-and-transaction-service&quot; aria-label=&quot;Anchor link for: product-and-transaction-service&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Product and Transaction Service&lt;&#x2F;h2&gt;
&lt;p&gt;What we want next is to implement the following query:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;graphql&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-graphql &quot;&gt;&lt;code class=&quot;language-graphql&quot; data-lang=&quot;graphql&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mutation&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;($&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;items&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;CreateTransactionItem&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!]!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;createTransaction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      items&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: $&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;items
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;errors &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;field
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;transaction &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;items &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;productId
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;price
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;quantity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The idea is that the user will buy a list of products from this API. To
test that out, we need to create the product and transaction service.
Given our template with account service, we can quickly copy and paste
to produce both services. For products, it exposes the two queries:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;graphql&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-graphql &quot;&gt;&lt;code class=&quot;language-graphql&quot; data-lang=&quot;graphql&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;query &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;products &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;price
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;product&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The first one is self-evident like with &lt;code&gt;users&lt;&#x2F;code&gt; query, the second one is
where we make it interesting. The &lt;code&gt;createTransaction&lt;&#x2F;code&gt; accepts a list of
product id and corresponding quantity. For each product id, the
transaction service will invoke the &lt;code&gt;product&lt;&#x2F;code&gt; query to fetch the current
price. Not the most efficient which is another issue down the road but
it does work.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TransactionClient&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    mutation($items: [CreateTransactionItem!]!) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      create_transaction(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        input: {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          items: $items
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      ) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        errors {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          field
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        transaction {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          items {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;            id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;            product_id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;            price
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;            quantity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# HERE: Context based here
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;create_transaction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; create_transaction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; create_transaction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For the astute reader, the &lt;code&gt;user_id&lt;&#x2F;code&gt; is nowhere to be seen so how will
the transaction know which user is assigned? It comes from the OAauth
header &lt;code&gt;Authorization&lt;&#x2F;code&gt; like with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ueberauth&#x2F;guardian&quot;&gt;guardian&lt;&#x2F;a&gt; but uses the user email
instead:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# api_gateway&#x2F;context.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ApiGatewayWeb&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Context &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;behaviour &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;alias &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conn
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; opts
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;call&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    context &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; build_context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put_options&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;build_context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;current_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; get_current_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defp &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_current_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    conn
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Conn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_req_header&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;authorization&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;List&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Bearer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; email &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountClient&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get_by_email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;email&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      _ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It just follows the &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;absinthe&#x2F;context-and-authentication.html#content&quot;&gt;context and authentication guide&lt;&#x2F;a&gt; for a quick
authentication plug. More importantly, the question is how does context
passing occur over multiple services? In this case, the context is
passed down the wire and read the same way; however, the better strategy
is to make the &lt;code&gt;user_id&lt;&#x2F;code&gt; an explicit argument than a context variable.
Nonetheless, it works like a charm but you need to handle string maps
again:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# transaction_service&#x2F;parse_context.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TransactionService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ParseContext &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;behaviour &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Middleware
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;call&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;unresolved&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    ctx &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    id &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; get_in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ctx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;current_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;])
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;res &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;context&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;current_user&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;call&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;do:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To test this mutation in GraphiQL, you need to do the following things:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Register a new user or pick a random user from &lt;code&gt;users&lt;&#x2F;code&gt; query and take
note of the email(&lt;code&gt;$EMAIL&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Add the header &lt;code&gt;Authorization: Bearer $EMAIL&lt;&#x2F;code&gt; which you can do via
&lt;code&gt;Headers&lt;&#x2F;code&gt; &amp;gt; &lt;code&gt;Add&lt;&#x2F;code&gt; button&lt;&#x2F;li&gt;
&lt;li&gt;Pick a random product and take note of its id (&lt;code&gt;$PRODUCT_ID&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Copy the source mutation above and use the payload via variables:&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;!--listend--&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;items&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;productId&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;$PRODUCT_ID&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;quantity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With that we have one thing left to verify the experiment.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;transactions-field&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#transactions-field&quot; aria-label=&quot;Anchor link for: transactions-field&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
transactions Field&lt;&#x2F;h2&gt;
&lt;p&gt;Once the user has made transactions, we will add a &lt;code&gt;User.transactions&lt;&#x2F;code&gt;
field to fetch that:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;graphql&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-graphql &quot;&gt;&lt;code class=&quot;language-graphql&quot; data-lang=&quot;graphql&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;query &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;users &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;email
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;transactions &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;items &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;product &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;price
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;price
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;quantity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The interesting fact here is that the gateway now provides a custom
field and fetches multiple services to provide that. This is not &lt;a href=&quot;https:&#x2F;&#x2F;www.apollographql.com&#x2F;docs&#x2F;apollo-server&#x2F;federation&#x2F;introduction&#x2F;&quot;&gt;Apollo
Federation&lt;&#x2F;a&gt; but it is rather fun. Anyway to resolve &lt;code&gt;User.transactions&lt;&#x2F;code&gt;,
we need the transaction service to return all transactions for a user
via &lt;code&gt;user_transaction&lt;&#x2F;code&gt; query:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;field &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;transactions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list_of&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;user_transaction&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;User transactions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;TransactionClient&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      query($user_id: ID!) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        user_transactions(user_id: $user_id) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          items {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;            id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;            product_id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;            price
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;            quantity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;user_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;user_transactions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; user_transactions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; user_transactions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lastly, we reuse the &lt;code&gt;product&lt;&#x2F;code&gt; query for product service to provide the
&lt;code&gt;TransactionItem.product&lt;&#x2F;code&gt; field:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;field &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; non_null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;product&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Transaction product&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ProductClient&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      query($id: ID!) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        product(id: $id) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;          price
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|&amp;gt; case do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}}} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With all that, it now works although slow. Indeed, this is where &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;absinthe&#x2F;Absinthe.Middleware.Batch.html#content&quot;&gt;Batch&lt;&#x2F;a&gt;
or &lt;a href=&quot;https:&#x2F;&#x2F;hexdocs.pm&#x2F;absinthe&#x2F;Absinthe.Middleware.Dataloader.html#content&quot;&gt;Dataloader&lt;&#x2F;a&gt; middleware come in and where each service must provide the
supporting queries. In general, each communication increases latency and
risk but natural under the microservice style.&lt;&#x2F;p&gt;
&lt;p&gt;Another issue I noticed with this approach is that multiple services are
listening to the same GraphQL response topic. Remember that the gateway
and transaction service are listening to the product response so if
either service makes a GraphQL request, both receive the response but
only one will find it useful. As this scales, so will the waste thus the
service dependencies must be watched.&lt;&#x2F;p&gt;
&lt;p&gt;Now that all services are ready, we can the final touch.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;graphiql&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#graphiql&quot; aria-label=&quot;Anchor link for: graphiql&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
GraphiQL&lt;&#x2F;h2&gt;
&lt;p&gt;One of the nice things about GraphQL is GraphiQL which alongside the
typed contract forces some form of documentation and experimentation.
We should also put &lt;code&gt;absinthe_plug&lt;&#x2F;code&gt; via &lt;code&gt;plug&lt;&#x2F;code&gt; for each service to make
it easier to access and introspect:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# account_service&#x2F;router.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defmodule &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Router &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Router
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  plug &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;RequestId
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  plug &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Logger
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  plug &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Parsers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;parsers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;urlencoded&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;multipart&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Parser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;pass&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;*&#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;],
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;json_decoder&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Jason
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  plug &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;match
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  forward &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;graphql&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;to&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;init_opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;schema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Schema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  forward &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;graphiql&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;to&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Absinthe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;GraphiQL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;init_opts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;schema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Schema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;advanced&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  plug &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;dispatch
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# account_service&#x2F;application.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;children &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;[
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Cowboy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;scheme&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;http&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;plug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AccountService&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Router&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;options&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;port&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;15000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Broker&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Repo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For each service, you might also nned the &lt;code&gt;middleware&lt;&#x2F;code&gt; fix because the
GraphiQL UI cannot handle &lt;code&gt;under_score&lt;&#x2F;code&gt; convention or that it reverts
back to being &lt;code&gt;camelCase&lt;&#x2F;code&gt;. Whichever the case, having a working GraphQL
UI is wonderful. The ports for each service is listed below:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Account Service: &lt;a href=&quot;http:&#x2F;&#x2F;localhost:15000&#x2F;graphiql&quot;&gt;http:&#x2F;&#x2F;localhost:15000&#x2F;graphiql&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Product Service: &lt;a href=&quot;http:&#x2F;&#x2F;localhost:16000&#x2F;graphiql&quot;&gt;http:&#x2F;&#x2F;localhost:16000&#x2F;graphiql&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Transaction Service: &lt;a href=&quot;http:&#x2F;&#x2F;localhost:17000&#x2F;graphiql&quot;&gt;http:&#x2F;&#x2F;localhost:17000&#x2F;graphiql&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Now that we are done, what have we learned in this encounter?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;review&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#review&quot; aria-label=&quot;Anchor link for: review&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Review&lt;&#x2F;h2&gt;
&lt;p&gt;Providing a GraphQL interface over a message queue was fun. It was not
as hard as I thought it would be initially, but now is the time to
address some issues and lessons I learned while writing it.&lt;&#x2F;p&gt;
&lt;p&gt;First off, the workflow with using GraphQL is more focused on providing
a good API schema which feels better than worrying about message queue
topics or mechanics; however, writing the query strings are bulky and
error prone in its own right. I can imagine writing multiple queries and
either making a typo or forgetting to update old queries. Testing should
catch this, but I am not aware of tooling like &lt;a href=&quot;https:&#x2F;&#x2F;www.apollographql.com&#x2F;docs&#x2F;react&#x2F;data&#x2F;fragments&#x2F;&quot;&gt;GraphQL fragments&lt;&#x2F;a&gt;. I
suppose this is expected as this is the same workflow with frontend
engineers consuming GraphQL interfaces.&lt;&#x2F;p&gt;
&lt;p&gt;One of the lost GraphQL qualities during this experiment was that fields
could be fetched on demand or query optimization. For example, when a
user wants to only fetch their ids, the internal GraphQL query to
account service fetches all fields. More strongly for the
&lt;code&gt;User.transactions&lt;&#x2F;code&gt; query, it fetches all the way down. I tried doing
some optimization myself using the definitions in the
&lt;code&gt;Absinthe.Resolution&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;elixir&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-elixir &quot;&gt;&lt;code class=&quot;language-elixir&quot; data-lang=&quot;elixir&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# product_service&#x2F;schema.ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; res &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;ProductClient&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    query($id: ID!) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      product(id: $id) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;to_field_query&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;definitions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;selections&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    %&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; product_id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    res&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, this only works for flat fields; when nested fields are needed,
the complexity spikes. Instead of handling it and dealing with edge
cases such as missing ids or fields, I think its fine to pull all the
fields since they are in an internal network. Perhaps one can find gold
with the &lt;code&gt;selections&lt;&#x2F;code&gt; variable for query optimization?&lt;&#x2F;p&gt;
&lt;p&gt;One concern close to my heart is testing which I did not go into detail
here since you need &lt;code&gt;conduit&lt;&#x2F;code&gt; experience is better in my opinion. The
usual tests for each subscriber module is to check for side effects and
whether messages where &lt;code&gt;acked&lt;&#x2F;code&gt; or not, now we the focus is satisfying
that GraphQL contract.&lt;&#x2F;p&gt;
&lt;p&gt;Another concern is error handling. For example a query is outdated and is
always producing a query error instead of an operation error, how does
the backend cope? It is good to assume external communication can fail
even if they are known assumptions. Still, the only option is to log it
and hopefully catch it in development..&lt;&#x2F;p&gt;
&lt;p&gt;Finally the shadow of message deduplication and unwanted response
recipients mean that this method may not be the best fit perhaps even
for long term.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#summary&quot; aria-label=&quot;Anchor link for: summary&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Summary&lt;&#x2F;h2&gt;
&lt;p&gt;To summarize all the findings:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Pros&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Schema Management&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Managing schema and types is far more interesting than handling routes&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;GraphiQL Interface&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;-&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The GraphQL interface is a nice introspection tool.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Unified Request&#x2F;Response&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Only one topic to manage all the request&#x2F;response messages.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;GraphQL Testing&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Testing GraphQL responses feel better than asserting message
acknowledgment or side-effects from handlers.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Cons&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Higher Latency&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;More messages means higher latency. Care must be exercised in making the
gateway as fast as it can be.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Messages Deduplication&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Mutations should consider messages being delivered at least once.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Unnecessary Subscribers&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Since every GraphQL response endpoint has many subscribers, a response
to one is broadcast to all making it garbage to all but one.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Query Bulk And Support&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Queries occupy space and is just as error prone in editing.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Query Optimization&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;GraphQL allows select fields to be pulled but the backend must pull all
the fields for safety.&lt;&#x2F;p&gt;
&lt;p&gt;To be safe, I am not vouching this for production as better techniques
may already exist. The request&#x2F;response module per message is still safe
and efficient. If ever I would make an API gateway, I might consider
revisiting this or pray that &lt;code&gt;absinthe&lt;&#x2F;code&gt; has better guidance or support
at that time. Nonetheless, this was a fun excursion.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Blog Update: From Jekyll To Zola</title>
          <pubDate>Sun, 29 Sep 2019 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/blog-update/</link>
          <guid>https://fnlog.dev/dev/blog-update/</guid>
          <description>&lt;h1 id=&quot;x-gonna-give-it-to-you&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#x-gonna-give-it-to-you&quot; aria-label=&quot;Anchor link for: x-gonna-give-it-to-you&quot;&gt;&gt;&lt;&#x2F;a&gt;
X Gonna Give It To YOu&lt;&#x2F;h1&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Understanding Rust Through AVL Trees</title>
          <pubDate>Wed, 31 Jul 2019 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/understanding-rust-through-avl-trees/</link>
          <guid>https://fnlog.dev/dev/understanding-rust-through-avl-trees/</guid>
          <description>&lt;h2 id=&quot;from-elixir-into-rust&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#from-elixir-into-rust&quot; aria-label=&quot;Anchor link for: from-elixir-into-rust&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
From&lt;Elixir&gt;, Into&lt;Rust&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I loved learning the &lt;a href=&quot;https:&#x2F;&#x2F;elixir-lang.org&#x2F;&quot;&gt;Elixir&lt;&#x2F;a&gt; language and how its pragmatic &lt;a href=&quot;https:&#x2F;&#x2F;elixir-lang.org&#x2F;getting-started&#x2F;mix-otp&#x2F;supervisor-and-application.html&quot;&gt;supervision
trees&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;elixir-lang.org&#x2F;getting-started&#x2F;processes.html&quot;&gt;process model&lt;&#x2F;a&gt; taught me the value &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Fault%5Ftolerance&quot;&gt;fault tolerance&lt;&#x2F;a&gt; as a
quality of code than of infrastructure. Having safety and failure
recovery as an idiomatic culture and mindset of the language made me a
better thinker and developer. As a personal preference then in
selecting new languages to learn, I look for potentially new
perspectives and insights that it ascribes to its pilgrims. In
general, a good learning curve is a good indicator since it has much
to teach.&lt;&#x2F;p&gt;
&lt;p&gt;Another language to learn that I believe is worth learning is &lt;a href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&#x2F;&quot;&gt;Rust&lt;&#x2F;a&gt;, a
system programming language with a strong culture of memory safety.
Its pervasive model of &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;book&#x2F;ch04-01-what-is-ownership.html&quot;&gt;ownership and lifetimes&lt;&#x2F;a&gt; alongside its demanding
yet helpful compiler makes compiling code both a challenge and thrill.
Aside from the higher learning curve, the absence of a garbage
collector and virtual machine while proclaiming safety and performance
in the face of concurrency is boldly insane. If I do invest, I expect
to be more acute about memory issues and be more confident with
algorithms.&lt;&#x2F;p&gt;
&lt;p&gt;After reading the &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;&quot;&gt;main online book&lt;&#x2F;a&gt;, the best way to understand a
language for me is by writing code with a project. Since &lt;em&gt;Rust&lt;&#x2F;em&gt; is a
safe alternative to the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;C%5F(programming%5Flanguage)&quot;&gt;C&lt;&#x2F;a&gt; language, I want to revisit the data
structures and algorithms that I avoided because of tricky pointer
management. In starting with &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Linked%5Flist&quot;&gt;linked lists&lt;&#x2F;a&gt;, I stumbled across &lt;a href=&quot;https:&#x2F;&#x2F;rust-unofficial.github.io&#x2F;too-many-lists&#x2F;&quot;&gt;Too Many
Linked List online book&lt;&#x2F;a&gt; which was godsend. Reading it next, I want to
step it up and implement a tricky data structure that had interesting
mechanics to prove my understanding: &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;AVL%5Ftree&quot;&gt;AVL Trees&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;To understand my intent to go back to the basics, I scoffed at &lt;em&gt;C&lt;&#x2F;em&gt; for
being too unsafe relative to &lt;a href=&quot;https:&#x2F;&#x2F;www.oracle.com&#x2F;java&#x2F;&quot;&gt;Java&lt;&#x2F;a&gt;&#x27;s automatic memory management during
my teenage years. What foolish thoughts. Nonetheless, it pushed me
away from learning lower level algorithms which I thought of a hole in
my knowledge for years. With this regret, I ran &lt;code&gt;cargo new --lib avl_tree_set_rs&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;After three weeks of struggling and tangents, I successfully wrote it
with green tests. I found my trial a rigorous yet enlightening
learning experience. Despite all the resistance and confusion from the
compiler, I trust that as long as it compiles, my code and more
importantly I feel safe, a similar feeling in &lt;a href=&quot;https:&#x2F;&#x2F;www.haskell.org&#x2F;&quot;&gt;Haskell&lt;&#x2F;a&gt;. In this
article, indulge me in my experience of implementing a self-balancing
binary tree in &lt;em&gt;Rust&lt;&#x2F;em&gt; as a learning project. Hopefully, this is worth
your time, helpful or entertaining. So what does it take to implement
an &lt;em&gt;AVL Tree&lt;&#x2F;em&gt; in &lt;em&gt;Rust&lt;&#x2F;em&gt;?&lt;&#x2F;p&gt;
&lt;p&gt;(Source code for this article can be found &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;avl%5Ftree%5Fset%5Frs&quot;&gt;here&lt;&#x2F;a&gt;.)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;REQUIREMENT:&lt;&#x2F;strong&gt;: This article assumes a &lt;code&gt;rustc&lt;&#x2F;code&gt; version of at least
&lt;code&gt;1.38&lt;&#x2F;code&gt; for the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rfcs&#x2F;blob&#x2F;master&#x2F;text&#x2F;2094-nll.md&quot;&gt;non-lexical lifetimes&lt;&#x2F;a&gt; if you want to compile or follow
the code.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;CAVEAT:&lt;&#x2F;strong&gt; This is not a tutorial on Rust. I assume you have read the
book yourself and somewhat familiar with binary trees or sets.
Although my writing may not be technically precise, I want to focus on
discussing &lt;em&gt;Rust&lt;&#x2F;em&gt; from a newcomer&#x27;s perspective. I do my best to link
relevant sections from the book to help me explain syntax and
concepts, so do visit them if you need to refresh yourself. You can
also try running &lt;code&gt;rustup doc --std&lt;&#x2F;code&gt; that opens a local copy of the
standard documentation. I found it quite helpful and convenient in
understanding functions and methods. If I make any incriminating
errors in terminology or code, do file an issue in the article&#x27;s
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;avl%5Ftree%5Fset%5Frs&#x2F;issues&quot;&gt;repository&lt;&#x2F;a&gt;, so we can rectify it and my thanks.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;avl%5Ftree%5Fset%5Frs&#x2F;pull&#x2F;1&quot;&gt;Corrections&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 2019-12-18:&lt;&#x2F;strong&gt; Credits to &lt;strong&gt;&lt;strong&gt;jbj&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; for filing a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;avl%5Ftree%5Fset%5Frs&#x2F;pull&#x2F;3&quot;&gt;PR&lt;&#x2F;a&gt; in rewriting
&lt;code&gt;take&lt;&#x2F;code&gt; and &lt;code&gt;insert&lt;&#x2F;code&gt; without using &lt;code&gt;unsafe&lt;&#x2F;code&gt; by using recursion.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;avl-trees&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#avl-trees&quot; aria-label=&quot;Anchor link for: avl-trees&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
AVL Trees&lt;&#x2F;h2&gt;
&lt;p&gt;As a short discussion, &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Binary%5Fsearch%5Ftree&quot;&gt;ordered binary trees&lt;&#x2F;a&gt; are good at searching
values. As more values expand the tree, it becomes less efficient
proportional to its height. Thus, rearranging nodes that minimize
height maintains lookup efficiency.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;binary-trees.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;To answer that issue, &lt;strong&gt;self-balancing trees&lt;&#x2F;strong&gt; balance themselves after
every node insertion and deletion. Different variants such &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Red%E2%80%93black%5Ftree&quot;&gt;Red-Black
Trees&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Splay%5Ftree&quot;&gt;Splay Trees&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;B-tree&quot;&gt;B-Trees&lt;&#x2F;a&gt; are available each with their own
strategy. I choose &lt;em&gt;AVL trees&lt;&#x2F;em&gt; for its conceptually simple left and
right rotations as its balancing strategy while proving a challenge in
&lt;em&gt;Rust&lt;&#x2F;em&gt; because of the pointers that dance in those rotations.&lt;&#x2F;p&gt;
&lt;p&gt;Implementing recursive data structures like trees and graphs in &lt;em&gt;Rust&lt;&#x2F;em&gt;
are not trivial because of its &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch04-01-what-is-ownership.html?highlight=stack,vs,hea#the-stack-and-the-heap&quot;&gt;ownership model&lt;&#x2F;a&gt; and potential &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Circular%5Freference&quot;&gt;circular
references&lt;&#x2F;a&gt;. Specially in insertion and deletion, swapping nodes and
values safely and correctly while obeying the rules is tricky itself.
Aside from those and some mangling of lifetime variables, we have a
modern &lt;em&gt;C&lt;&#x2F;em&gt; language with familiar functional programming concepts at
our disposal . Despite the uncertainty, tackling this classic
structure with modern ideas makes it feel approachable.&lt;&#x2F;p&gt;
&lt;p&gt;For this project, we will build our &lt;em&gt;AVL tree&lt;&#x2F;em&gt; as a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Set%5F(abstract%5Fdata%5Ftype)&quot;&gt;set&lt;&#x2F;a&gt;. To understand
idiomatic language design, we will follow and implement methods from
the ordered tree set of the standard collection:
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;collections&#x2F;struct.BTreeSet.html&quot;&gt;std::collections::BTreeSet&lt;&#x2F;a&gt;. As much as I would implement every
relevant method, the focus of this article is inserting and deleting
values from our set that we will discuss in three major sections:
&lt;strong&gt;insertion&lt;&#x2F;strong&gt;, &lt;strong&gt;balancing&lt;&#x2F;strong&gt; and &lt;strong&gt;deletion&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Since this article is long, feel free to stop and come back anytime.
Below are links to major sections each with their own links to
their subsections:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#insertion&quot;&gt;Insertion&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#rebalancing&quot;&gt;Rebalancing&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#deletion&quot;&gt;Deletion&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#beyond-parity&quot;&gt;Beyond Parity&lt;&#x2F;a&gt; (&lt;em&gt;Optional&lt;&#x2F;em&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#reflecting-on-rust&quot;&gt;Reflecting On Rust&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;insertion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#insertion&quot; aria-label=&quot;Anchor link for: insertion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Insertion&lt;&#x2F;h2&gt;
&lt;p&gt;To begin our journey, we will implement the insertion (&lt;code&gt;.insert&lt;&#x2F;code&gt;)
method to populate our set and test the values with an iterator
(&lt;code&gt;.iter&lt;&#x2F;code&gt;) method. Since implementing balancing strategy is challenging
upfront, we will implement it after this to have a working feedback
cycle and momentum.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#data-types&quot;&gt;Data Types&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#insert-method&quot;&gt;Insert Method&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#iterator&quot;&gt;Iterator&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#testing-insert&quot;&gt;Testing Insert&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;data-types&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#data-types&quot; aria-label=&quot;Anchor link for: data-types&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Data Types&lt;&#x2F;h3&gt;
&lt;p&gt;What is the design of our tree structure? With some hint from &lt;a href=&quot;https:&#x2F;&#x2F;rust-unofficial.github.io&#x2F;too-many-lists&#x2F;second-option.html&quot;&gt;this
chapter&lt;&#x2F;a&gt;, we will use a recursive tree design:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; T,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt; = Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; What is Box?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To explain some &lt;em&gt;Rust&lt;&#x2F;em&gt; specific details, our set library must take
any value that can be ordered, so we declare a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch10-00-generics.html&quot;&gt;generic type&lt;&#x2F;a&gt; that
implements the ordering (&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;cmp&#x2F;index.html&quot;&gt;std::cmp::Ord&lt;&#x2F;a&gt;) trait (&lt;code&gt;T: Ord&lt;&#x2F;code&gt;). The main
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch05-01-defining-structs.html?highlight=struct#defining-and-instantiating-structs&quot;&gt;struct&lt;&#x2F;a&gt; &lt;code&gt;AvlNode&lt;&#x2F;code&gt; expresses a binary tree node that stores a value and
possibly has a left and right subtree where the child value is less
than and greater than respectively this node&#x27;s stored value. The
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch19-04-advanced-types.html?highlight=Aliasing#creating-type-synonyms-with-type-aliases&quot;&gt;newtype&#x2F;type alias&lt;&#x2F;a&gt; &lt;code&gt;AvlTree&lt;&#x2F;code&gt; represents either an empty value&#x2F;tree or
a node which completes the recursive definition by using the
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;option&#x2F;index.html&quot;&gt;std::option::Option&lt;&#x2F;a&gt; type. Finally, &lt;code&gt;AvlTreeSet&lt;&#x2F;code&gt; provides the
interface over the underlying data structure. Optionally, we also
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;appendix-03-derivable-traits.html?highlight=derive#appendix-c-derivable-traits&quot;&gt;derive&lt;&#x2F;a&gt; some useful traits such as debugging via &lt;code&gt;dbg!&lt;&#x2F;code&gt;
(&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;fmt&#x2F;trait.Debug.html&quot;&gt;std::fmt::Debug&lt;&#x2F;a&gt;), allow equality checks &lt;code&gt;==&lt;&#x2F;code&gt; (&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;cmp&#x2F;trait.PartialEq.html&quot;&gt;std::cmp::PartialEq&lt;&#x2F;a&gt;)
and cloning capabilities for testing with &lt;code&gt;.clone&lt;&#x2F;code&gt;
(&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;clone&#x2F;trait.Clone.html&quot;&gt;std::clone::Clone)&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This design is similar in other languages like &lt;a href=&quot;https:&#x2F;&#x2F;wiki.haskell.org&#x2F;99%5Fquestions&#x2F;54A%5Fto%5F60&quot;&gt;Haskell&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;docs.oracle.com&#x2F;javase&#x2F;7&#x2F;docs&#x2F;api&#x2F;java&#x2F;util&#x2F;TreeSet.html&quot;&gt;Java&lt;&#x2F;a&gt;, so
we have not strayed far from the path. The snippet below shows how to
initialize this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlNode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlNode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlNode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlNode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlNode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As cumbersome it is to initialize, we encounter our first memory
design consideration for recursive structures: &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;boxed&#x2F;index.html&quot;&gt;std::boxed::Box&lt;&#x2F;a&gt;.
Generally, structs or data types should have a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;marker&#x2F;trait.Sized.html&quot;&gt;known or constant size&lt;&#x2F;a&gt;
for memory allocation. Every primitive type has a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;mem&#x2F;fn.size%5Fof.html&quot;&gt;fixed size&lt;&#x2F;a&gt; such as
&lt;code&gt;1&lt;&#x2F;code&gt; byte for &lt;code&gt;bool&lt;&#x2F;code&gt; and &lt;code&gt;u8&lt;&#x2F;code&gt; and &lt;code&gt;4&lt;&#x2F;code&gt; bytes for &lt;code&gt;i32&lt;&#x2F;code&gt; or &lt;code&gt;char&lt;&#x2F;code&gt;. While
complex structures can be thought of as a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;mem&#x2F;fn.size%5Fof.html#size-of-structs&quot;&gt;sum of its parts&lt;&#x2F;a&gt;, the
compiler cannot infer the known size for recursive structure at
compile time since the size is proportional to the level of nesting
required at runtime. To resolve this constant and dynamic memory
conundrum, since references and pointers also have the &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;mem&#x2F;fn.size%5Fof.html&quot;&gt;same and fixed
size&lt;&#x2F;a&gt;, we wrap the recursive data with a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch15-00-smart-pointers.html?highlight=fat,pointer#smart-pointers&quot;&gt;heap allocated pointer&lt;&#x2F;a&gt; which
stores and points to the data in the heap that &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;alloc&#x2F;#boxed-values&quot;&gt;satisfies the size
constraint&lt;&#x2F;a&gt; and why we wrap each child node with &lt;code&gt;Box::new&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This is unlike other languages where you could use the types without
such consideration. Initially awkward, I find it fascinating that
&lt;em&gt;Rust&lt;&#x2F;em&gt; requires some forethought to also think about how data is
stored (&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch04-01-what-is-ownership.html?highlight=stack,vs,hea#the-stack-and-the-heap&quot;&gt;Stack or Heap&lt;&#x2F;a&gt;) at a safe and high level. That this enforced
compiler discipline gives me the impression that code in this
language is more likely to be planned and deliberate. Definitions
done, we proceed with the main method.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;insert-method&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#insert-method&quot; aria-label=&quot;Anchor link for: insert-method&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Insert Method&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Parity:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;collections&#x2F;btree%5Fset&#x2F;struct.BTreeSet.html#method.insert&quot;&gt;BTreeSet::insert&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;To insert new values our tree set, we follow a standard procedure for
binary trees:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Starting from the root node or with a current node&lt;&#x2F;li&gt;
&lt;li&gt;Move to the left node if the value is less than the current node,
right if greater, and stop if equal&lt;&#x2F;li&gt;
&lt;li&gt;Do this until you an empty node and insert the value&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Translating this into &lt;em&gt;Rust&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;cmp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1. Starting from the root node or with a current node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 2. Move to the left node if the value is less than the current node,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;    right if greater, and stop if equal
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cmp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Less &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Equal &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Greater &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 3. Do this until you an empty node and insert the value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlNode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch18-01-all-the-places-for-patterns.html?highlight=pattern,mat#while-let-conditional-loops&quot;&gt;pattern matching&lt;&#x2F;a&gt;, it is easily done and also handles the empty
tree case. The snippet below shows how to use it:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Insert new value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Should not insert existing value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Insert another new value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Checking the tree structure
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlNode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlNode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;How do we test &lt;code&gt;.insert&lt;&#x2F;code&gt;? We could implement &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;collections&#x2F;btree%5Fset&#x2F;struct.BTreeSet.html#method.contains&quot;&gt;BTreeSet::contains&lt;&#x2F;a&gt; to
test if the inserted value is present; however, where it is inserted
also matters. If the node is inserted in the left instead of the
right, the order of the set would be incorrect. So we need to test it
structurally, and we can do that with an &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Iterator&quot;&gt;tree iterator&lt;&#x2F;a&gt; which we will
implement next.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;iterator&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#iterator&quot; aria-label=&quot;Anchor link for: iterator&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Iterator&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Parity:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;collections&#x2F;btree%5Fset&#x2F;struct.BTreeSet.html#method.iter&quot;&gt;BTreeSet::iter&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;For our ordered set, we want the iterator to process the data in
ascending order, so we will use an &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Tree%5Ftraversal#Pre-order%5F(NLR)&quot;&gt;in-order traversal&lt;&#x2F;a&gt; or
left-node-right approach. Since this is lower level language, we are
using a loop instead of a recursive function to express the
algorithm:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Starting from the root node or with a current node&lt;&#x2F;li&gt;
&lt;li&gt;If the node has a left subtree, store this node in a stack of
unemitted nodes, then move to the left node and repeat this step&lt;&#x2F;li&gt;
&lt;li&gt;Otherwise, emit the value&lt;&#x2F;li&gt;
&lt;li&gt;Next if the node has a right subtree, then move to the right node
and repeat from step 2&lt;&#x2F;li&gt;
&lt;li&gt;If neither and there is an unemitted node in the stack, pop that
and emit that node&#x27;s value and repeat step 3 with that right node&lt;&#x2F;li&gt;
&lt;li&gt;If no more unemitted nodes remain, stop&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The common pattern is to implement a &lt;code&gt;.iter&lt;&#x2F;code&gt; method that will return
a struct that implements &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;index.html#implementing-iterator&quot;&gt;std::iter::Iterator&lt;&#x2F;a&gt; and emits references to
the underlying tree. Before working on the code, we need to define
the struct to hold the iterator state that holds the previously
traversed nodes and the current tree:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSetIter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;prev_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;current_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Iterator &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSetIter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unimplemented!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Addition of lifetime parameter for the set
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSetIter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        AvlTreeSetIter &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            prev_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            current_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from treating &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;vec&#x2F;struct.Vec.html#method.push&quot;&gt;std::vec::Vec&lt;&#x2F;a&gt; as a stack, we need to discuss
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch10-03-lifetime-syntax.html?highlight=lifetime#lifetime-annotation-syntax&quot;&gt;lifetime for parameters&lt;&#x2F;a&gt;. This is one of &lt;em&gt;Rust&lt;&#x2F;em&gt; concepts that is
conceptually easy but understanding the syntax requires practice.
Fundamentally, every reference has a lifetime scope before being
dropped that must not outlive the owner to avoid dangling
references. Our iterator will not mutate or acquire ownership of the
tree, instead it needs a reference to traverse it and that the
iterator lives as long as the set itself. We express this by
introducing a lifetime parameter(&lt;code&gt;&#x27;a&lt;&#x2F;code&gt;) on each struct that is
connected through the &lt;code&gt;.iter&lt;&#x2F;code&gt;. We also specify that emitted reference
values also live as long as the iterator itself through the
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch19-03-advanced-traits.html#specifying-placeholder-types-in-trait-definitions-with-associated-types&quot;&gt;associated type&lt;&#x2F;a&gt; (&lt;code&gt;Item&lt;&#x2F;code&gt;). Even with all this extra typing for
lifetimes, the compiler is quite helpful in ensuring that the
iterator safely references the set.&lt;&#x2F;p&gt;
&lt;p&gt;Another interesting discipline of &lt;em&gt;Rust&lt;&#x2F;em&gt; in thinking about the
lifetime requirements of references as part of the design. My
personal learning experience is to add explicit annotation for each
reference, figure out their scope and then remove it if unnecessary
as with &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch10-03-lifetime-syntax.html?highlight=Eli#lifetime-elision&quot;&gt;lifetime elision&lt;&#x2F;a&gt;. As much as possible, I let the Rust
compiler infer as much and stepping in when needed.&lt;&#x2F;p&gt;
&lt;p&gt;Going back, when implementing &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch04-01-what-is-ownership.html?highlight=stack,vs,hea#the-stack-and-the-heap&quot;&gt;Iterator::next&lt;&#x2F;a&gt; method, we return
&lt;code&gt;Some(value)&lt;&#x2F;code&gt; when we want to emit &lt;code&gt;value&lt;&#x2F;code&gt; and return &lt;code&gt;None&lt;&#x2F;code&gt; if we
have no more. With this in mind, we can proceed:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;loop &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match *self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None =&amp;gt; match self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None =&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;continue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although a bit longer, it just requires a little work. One thing I
find interesting here is that pattern matching also has move
semantics via &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;keyword.ref.html&quot;&gt;ref&lt;&#x2F;a&gt; keyword. Quite intriguing where borrow mechanics
pervade even the familiar pattern matching. To show our code works,
we insert a range backwards (&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;trait.Iterator.html#method.rev&quot;&gt;Iterator::rev&lt;&#x2F;a&gt;) and expect it to come up
in ascending order:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; iter &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Can we test &lt;code&gt;.iter&lt;&#x2F;code&gt; without &lt;code&gt;.insert&lt;&#x2F;code&gt;? If we create a different
constructor for our set that takes a collection or iterator and build
nodes around it, we certainly could; however, it requires that we
arrange them in a balanced manner which is beyond our current
capacity. Testing both &lt;code&gt;.iter&lt;&#x2F;code&gt; and &lt;code&gt;.insert&lt;&#x2F;code&gt; is the simplest way to
go.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;testing-insert&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#testing-insert&quot; aria-label=&quot;Anchor link for: testing-insert&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Testing Insert&lt;&#x2F;h3&gt;
&lt;p&gt;To test &lt;code&gt;.iter&lt;&#x2F;code&gt; and &lt;code&gt;.insert&lt;&#x2F;code&gt; together, we do the following:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Create a random list&lt;&#x2F;li&gt;
&lt;li&gt;Create an empty AVL tree and BTree&lt;&#x2F;li&gt;
&lt;li&gt;For each element in the list, insert it to both tree&lt;&#x2F;li&gt;
&lt;li&gt;Both AVL and BTree iterator should be equal item per item&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;For generating random data, we will use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;quickcheck&quot;&gt;quickcheck&lt;&#x2F;a&gt; as a generator and
our testing style: &lt;a href=&quot;https:&#x2F;&#x2F;begriffs.com&#x2F;posts&#x2F;2017-01-14-design-use-quickcheck.html&quot;&gt;property based testing&lt;&#x2F;a&gt;. Instead of testing just
correct input and output like with &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Test-driven%5Fdevelopment&quot;&gt;TDD&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Behavior-driven%5Fdevelopment&quot;&gt;BDD&lt;&#x2F;a&gt;, we focus on proving
properties or statements are correct for every possible value. &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Parity%5F(mathematics)&quot;&gt;For
example with odd and even integers&lt;&#x2F;a&gt;, adding two even or odd integers
will always be even while adding an even and odd integer together
will always be odd. For testing abstract data types with little or no
state, testing structural properties is easier than asserting the
structure itself.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Our first statement&#x2F;property is that our AVL tree and BTree have
equal iterators&lt;&#x2F;strong&gt; since it exercises the whole structure and order. To
assist in testing, we employ &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bluss&#x2F;rust-itertools&quot;&gt;rust-itertools&lt;&#x2F;a&gt; to test iterator equality
via &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;itertools&#x2F;0.6.0&#x2F;itertools&#x2F;fn.equal.html&quot;&gt;itertools::equal&lt;&#x2F;a&gt; since it is better than using &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;trait.Iterator.html#method.zip&quot;&gt;Iterator::zip&lt;&#x2F;a&gt; and
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;macro.assert%5Feq.html&quot;&gt;assert_eq!&lt;&#x2F;a&gt; in a for loop. We also implement the convenience trait,
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;trait.IntoIterator.html&quot;&gt;std::iter::IntoIterator&lt;&#x2F;a&gt;, to use &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;trait.Iterator.html#method.collect&quot;&gt;IntoIterator::collect&lt;&#x2F;a&gt; method to
easily transforms iterators into other collections as shown below:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;FromIterator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;I&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;IntoIterator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item = T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; I&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; iter &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        set
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; The power of IntoIterator
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; vec &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; avl  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With all this foundation, creating a test for the iterator is precise:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mod &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;properties &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use super&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collections&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1. Create a random list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iterator_parity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 2. Create an empty AVL tree and BTree
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 3. For each element in the list, insert it to both tree
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; avl_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 4. Both AVL and BTree iterator should be equal item per item
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        equal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;avl_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Instead of &lt;code&gt;#[test]&lt;&#x2F;code&gt;, we use &lt;code&gt;#[quickcheck]&lt;&#x2F;code&gt; macro to indicate it is
a property based test. The actual mechanics of this style is that it
will generate a random value each argument in the function, run the
test and repeat it around &lt;code&gt;10,000&lt;&#x2F;code&gt; in an attempt to find a value that
returns &lt;code&gt;false&lt;&#x2F;code&gt; or breaks the test. In this case, the test creates
random &lt;code&gt;usize&lt;&#x2F;code&gt; lists and check the iterators as described above. The
generated lists are also not sorted and not unique that challenges
order and uniqueness. Until a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Counterexample&quot;&gt;counterexample&lt;&#x2F;a&gt; is found, we can assume
it correct.&lt;&#x2F;p&gt;
&lt;p&gt;We also check insert parity for completion:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert_parity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; avl_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     avl_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Given an equal AVL and BTree set, &lt;code&gt;.insert&lt;&#x2F;code&gt; should be the same for
every value&lt;&#x2F;strong&gt;. We can let &lt;em&gt;quickcheck&lt;&#x2F;em&gt; generate a random &lt;code&gt;BTreeSet&lt;&#x2F;code&gt; as
well and copy it in the same manner. Since &lt;code&gt;x&lt;&#x2F;code&gt; is also random, it is
either in the created sets or not that creates a positive and
negative case for inserting duplicates. With both tests written, we
run the tests with &lt;code&gt;cargo test&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;  Compiling avl_tree_set_rs v0.1.0 (&#x2F;home&#x2F;nobody&#x2F;avl_tree_set_rs)
&lt;&#x2F;span&gt;&lt;span&gt;    Finished dev [unoptimized + debuginfo] target(s) in 0.91s
&lt;&#x2F;span&gt;&lt;span&gt;     Running target&#x2F;debug&#x2F;deps&#x2F;avl_tree_set_rs-5f93a12c976aa84b
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;running 2 tests
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::iterator_parity ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::insert_parity ... ok
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We now have a working tree set. Of course, since we did not rebalance
the tree, we only crafted a standard binary tree but it is a start.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;reflection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reflection&quot; aria-label=&quot;Anchor link for: reflection&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Reflection&lt;&#x2F;h3&gt;
&lt;p&gt;Working with &lt;em&gt;Rust&lt;&#x2F;em&gt; in this first section is not bad. Going back to a
static type system is reinvigorating. I really liked that structs,
pattern matching and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Type%5Fclass&quot;&gt;type classes&lt;&#x2F;a&gt; were included in the language, so I
had no problem there. Typing and understanding lifetime annotations
is one thing that made &lt;em&gt;Rust&lt;&#x2F;em&gt; different. Understanding the wide array
of traits and types itself is not trivial, so it is challenging how
their lifetime are factored in as well.&lt;&#x2F;p&gt;
&lt;p&gt;As a beginner, taking some time to look at the various traits and
types and their implementation made it click for me. Having the
documentation at the ready with &lt;code&gt;rustup doc --std&lt;&#x2F;code&gt; was great tooling.
Thankfully, we only require the basic concepts so it is more a
learning experience. So far, &lt;em&gt;Rust&lt;&#x2F;em&gt; does play like a low-level modern
language with some of the best modern features I value.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rebalancing&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rebalancing&quot; aria-label=&quot;Anchor link for: rebalancing&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Rebalancing&lt;&#x2F;h2&gt;
&lt;p&gt;With a working binary tree, we apply the rebalancing strategy by
deciding how to implement height and node rotation. We then integrate
it back to &lt;code&gt;.insert&lt;&#x2F;code&gt; and update our test.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#balance-factor-and-height&quot;&gt;Balance Factor And Height&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#unsafe-decision&quot;&gt;Unsafe Decision&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#height-testing&quot;&gt;Height Testing&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#node-rotation&quot;&gt;Node Rotation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#rotation-testing&quot;&gt;Rotation Testing&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#rebalancing-insert&quot;&gt;Rebalancing Insert&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;balance-factor-and-height&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#balance-factor-and-height&quot; aria-label=&quot;Anchor link for: balance-factor-and-height&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Balance Factor And Height&lt;&#x2F;h3&gt;
&lt;p&gt;Given a node, it has a &lt;strong&gt;balance factor&lt;&#x2F;strong&gt; that is the height of the
left tree minus the height of the right tree. The idea is that when
the balance factor grows to &lt;code&gt;2&lt;&#x2F;code&gt; or &lt;code&gt;-2&lt;&#x2F;code&gt;, a rotation of nodes or
transfer of nodes from one side to the other will fix the balance.
Starting with this definition, implementing the balance factor for
nodes is direct with some type truncation safety:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;i8 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_height &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_height &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_height &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_height &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_height &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i8
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_height &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as i8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since our type uses &lt;code&gt;usize&lt;&#x2F;code&gt;, we need to consider subtraction
overflow. Assuming the tree is balanced, the balance factor can only
be from &lt;code&gt;-2&lt;&#x2F;code&gt; to &lt;code&gt;2&lt;&#x2F;code&gt;, so we can also use improve the return type from
&lt;code&gt;isize&lt;&#x2F;code&gt; to &lt;code&gt;i8&lt;&#x2F;code&gt; as a tiny optimization. However, if our tree does not
update height properly, we will have overflow from the smaller
datatype as a consequence. For the pragmatic, directly subtracting
the left and right height and using &lt;code&gt;isize&lt;&#x2F;code&gt; is valid but still holds
as a gentle reminder of what &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Integer%5F%2528computer%5Fscience%2529&quot;&gt;unsigned integers&lt;&#x2F;a&gt; are and its design
impact.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, we need to define a &lt;strong&gt;height&lt;&#x2F;strong&gt; field that is defined
recursively as the larger height of the left or right subtree plus
one and empty trees have an empty height of zero. Word-for-word, it
is written as:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;cmp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map_or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Use &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;option&#x2F;enum.Option.html#method.map%5For&quot;&gt;Option::map_or&lt;&#x2F;a&gt; when you need map and unwrap with a default in one
go. However, updating ancestor nodes is expensive or inefficient when
it traverses the same node multiple times, so we turn this into a field to
cache the computation instead. Updating our definition of node:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; T,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; New field
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;height &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After inserting or deleting a node, we need to traverse the ancestor
nodes to update their height as a trade-off. Definitions done,
implementing rotations was my first real struggle in &lt;em&gt;Rust&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;unsafe-decision&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#unsafe-decision&quot; aria-label=&quot;Anchor link for: unsafe-decision&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Unsafe Decision&lt;&#x2F;h3&gt;
&lt;p&gt;How do we traverse upwards in our tree after every node insertion? A
quick solution is to add a mutable reference to the parent node and
use that to traverse until the root like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; PartialEq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;struct &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt; T,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Sad, extra annotations required
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize,
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; New field
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;parent_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_ancestors_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parent_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parent_node &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            parent_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            current_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parent_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, this creates a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch15-06-reference-cycles.html?highlight=Weak#preventing-reference-cycles-turning-an--rct--into-a--weakt&quot;&gt;cyclic reference&lt;&#x2F;a&gt; between parent and child
which is dangerous and discouraged in &lt;em&gt;Rust&lt;&#x2F;em&gt;. Personally, it also
makes the design dirtier that requiring a reference only for
traversing upwards on insert and delete operations seems overkill.
Going back to &lt;code&gt;.insert&lt;&#x2F;code&gt;, we can track them with a stack instead via
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;vec&#x2F;struct.Vec.html#method.push&quot;&gt;Vec::push&lt;&#x2F;a&gt; mechanics:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_nodes &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        prev_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; match ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Traversing a list as a stack needs to be reversed via .rev first
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The problem here is that &lt;code&gt;current_node&lt;&#x2F;code&gt; is mutable borrowed twice:
one for a mutable left or right child node and one for traversed
stack&#x2F;vector. I would argue that the mutability of the tracking nodes
is safe since it is used after the insert mutation is done. Crawling
the web for idiomatic solutions, the suggested strategy is to use the
combination of a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;rc&#x2F;index.html&quot;&gt;reference counted pointer&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;cell&#x2F;index.html&quot;&gt;interior mutable cell&lt;&#x2F;a&gt;
or &lt;code&gt;Rc&amp;lt;RefCell&amp;lt;T&amp;gt;&amp;gt;&lt;&#x2F;code&gt; pattern to allow multiple mutable references. I
initially thought I could use this just in the function itself
without changing the definition of the node but I could not:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;rc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Rc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;RefCell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTree&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt; = Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Rc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;RefCell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To use them as intended, we would need to own the data we are using;
however that is not possible since we are behind a mutable reference,
&lt;code&gt;&amp;amp;mut self&lt;&#x2F;code&gt;. Even if I could make the code work, the fact that I had
to change the types and include reference counting complicates the
design needlessly just to retrace the nodes. Up to this point, I find
&lt;em&gt;Rust&lt;&#x2F;em&gt;&#x27;s strictness comforting in spite of my struggle; however, I
feel that I need to loosen up the restriction a bit to avoid
unnecessary complexity. In this case, we want to allow one secondary
mutable reference after insertion and doing this requires &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch19-01-unsafe-rust.html&quot;&gt;Unsafe
Rust&lt;&#x2F;a&gt;. &lt;strong&gt;Unsafe Rust&lt;&#x2F;strong&gt; allows us to ignore borrowing rules for
mutability as specified in this &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch19-01-unsafe-rust.html#dereferencing-a-raw-pointer&quot;&gt;section of the book&lt;&#x2F;a&gt;. Using raw
pointers allows our implementation to be uncomplicated:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_ptrs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        prev_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Converting a mutable reference to a pointer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ... match ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; ... insert ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut *&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Converting a mutable pointer back to a reference
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The arcane magic of unsafe is better explained in the &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;nomicon&#x2F;borrow-splitting.html?highlight=Tree#splitting-borrows&quot;&gt;Rustonomicon&lt;&#x2F;a&gt;
which I plan to read after writing this. Since we told &lt;em&gt;Rust&lt;&#x2F;em&gt; to
trust us, we need to guarantee our function is safe. The most visible
angle is the one using &lt;code&gt;unsafe&lt;&#x2F;code&gt; or the raw pointers themselves. The
mutable method, &lt;code&gt;.update_height&lt;&#x2F;code&gt;, only requires that its children
have the correct height before updating itself. As an anecdote, I
forgot to reverse the list before iterating (since push operation
append at the end) and caused incorrect node heights because the
parents were updated before the children. With this possibility, we
also need to test the height property.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;height-testing&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#height-testing&quot; aria-label=&quot;Anchor link for: height-testing&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Height Testing&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Given any AVL tree set, each node&#x27;s height is one more than the
larger height of the left or right subtree&lt;&#x2F;strong&gt;. To make testing easier,
we can do two short things. First, instead of pattern matching the
structure, we can refactor &lt;code&gt;.iter&lt;&#x2F;code&gt; to emit the nodes instead of their
values &lt;code&gt;.node_iter&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Using impl Traits
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Iterator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item = &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; impl &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Iterator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item = &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        AvlTreeSetNodeIter &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            prev_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            current_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As an aside, I suggest learning &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch10-02-traits.html#returning-types-that-implement-traits&quot;&gt;impl Traits&lt;&#x2F;a&gt; that allows you to
return an abstract trait type instead of the concrete type as in
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Polymorphism%5F(computer%5Fscience)&quot;&gt;polymorphism&lt;&#x2F;a&gt;. Using that, we can implement &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;index.html#adapters&quot;&gt;generic iterator adapters&lt;&#x2F;a&gt;
for &lt;code&gt;.iter&lt;&#x2F;code&gt; that maps over &lt;code&gt;.node_iter&lt;&#x2F;code&gt;. Without it, creating
abstractions on top of another becomes a noisy type fest:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;core&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSetNodeIter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&amp;#39;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSetNodeIter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    AvlTreeSetNodeIter &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        prev_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        current_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Going back, the new &lt;code&gt;AvlTreeSetNodeIter&lt;&#x2F;code&gt; is a copied version of the
original iterator with &lt;code&gt;Some(&amp;amp;current_node.value)&lt;&#x2F;code&gt; replaced to
&lt;code&gt;Some(&amp;amp;current_node)&lt;&#x2F;code&gt;. Moving on the second item, instead of creating
the sets through &lt;code&gt;.collect&lt;&#x2F;code&gt; method; we can also have it generated by
implementing the &lt;code&gt;Arbitrary&lt;&#x2F;code&gt; trait ourselves:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Arbitrary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Gen&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Refit and copied from quickcheck
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; https:&#x2F;&#x2F;docs.rs&#x2F;quickcheck&#x2F;0.8.5&#x2F;src&#x2F;quickcheck&#x2F;arbitrary.rs.html#385-395
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Arbitrary &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; Arbitrary &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;arbitrary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;G&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Gen&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; G&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Arbitrary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;arbitrary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;shrink&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;dyn &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Iterator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;Item = &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;shrink&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;()))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Putting those two together, we have another simple test:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;cmp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;itertools&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;all&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    all&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;height &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Another succinct test that &lt;code&gt;.update_height&lt;&#x2F;code&gt; correctly updates the
child all the way up to the root and that our use of &lt;code&gt;unsafe&lt;&#x2F;code&gt; is
truly safe. Whether you agree with my use of &lt;code&gt;unsafe&lt;&#x2F;code&gt;, I learned a
certain reverence in asking permission to use dangerous features and
heightened responsibility in upholding the law that reminds me of
&lt;a href=&quot;https:&#x2F;&#x2F;wiki.haskell.org&#x2F;IO%5Finside&quot;&gt;Haskell&#x27;s IO&lt;&#x2F;a&gt; boundaries. Nonetheless, we can now tackle node
rotation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;node-rotation&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#node-rotation&quot; aria-label=&quot;Anchor link for: node-rotation&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Node Rotation&lt;&#x2F;h3&gt;
&lt;p&gt;After inserting a node in a balanced AVL tree, it becomes
&lt;strong&gt;imbalanced&lt;&#x2F;strong&gt; when a node has a left and right subtree height
difference of &lt;code&gt;2&lt;&#x2F;code&gt; or &lt;code&gt;-2&lt;&#x2F;code&gt;. To correct this, we move nodes around while
preserving order. Visualizing the operation for rotating nodes to the
right:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;right-rotation.jpg&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Given a node, the idea is to promote the left child as the root and
demote the old root as a right child. While retaining other node
relationships, the orphaned left-right child of the old root is now
the right-left child of the new root. Those two movements constitute
the right rotation of nodes. As a general observation, moving nodes
from one side to the other should change the balance factor. Based on
the diagram above, we can say it changes by &lt;code&gt;2&lt;&#x2F;code&gt; perhaps. We&#x27;ll verify
this observation later.&lt;&#x2F;p&gt;
&lt;p&gt;Implementing the rotation took me a long time to do with two primary
constraints. First was to avoid using &lt;code&gt;unsafe&lt;&#x2F;code&gt; again. Another is to
avoid create another node or heap allocated pointer via &lt;code&gt;Box::new&lt;&#x2F;code&gt; to
be memory efficient. After several attempts, I came up with this safe
implementation of right rotation:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;std&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;mem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; swap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1. Take nodes A and C
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_right_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_left_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 2. Link A node to left node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_right_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_left_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 3. Swap B and D node value to avoid moving the root
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        swap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 4. Take E node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 5. Link C and E nodes to swapped D node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_right_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        new_right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        new_right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 6. Link swapped D node to root right node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;By carefully using &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;mem&#x2F;fn.swap.html?search=&quot;&gt;std::mem::swap&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;mem&#x2F;fn.replace.html&quot;&gt;std::mem::replace&lt;&#x2F;a&gt;, we avoid
creating nodes by replacing the value and links of an existing node
instead. The main idea is about taking nodes from the left side and
placing them on the right carefully. Referring to the rotation
diagram while stepping through the code might help. After rotating,
we also need to update the heights of the right tree and the node
itself since they had new nodes. One minor thing is that we also
return a flag to indicate that the operation was executed or not for
our tests later. To compare and contrast, my first version is indeed
shorter yet memory inefficient:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_right_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_root &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= *&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; old_root &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; new_root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;old_root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))); &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; New pointer created here
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Assuming it is correct in either version, implementing the left
rotation is a bit of cheat by swapping every &lt;code&gt;left&lt;&#x2F;code&gt; with &lt;code&gt;right&lt;&#x2F;code&gt; text
in the function since they are symmetrical. To say that we have
working and safe rotations after days of working back and forth is
nothing short of bliss. As we did before, we need to prove it works.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;rotation-testing&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rotation-testing&quot; aria-label=&quot;Anchor link for: rotation-testing&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Rotation Testing&lt;&#x2F;h3&gt;
&lt;p&gt;We have two statements to test about node rotation: &lt;strong&gt;rotations should
preserve order and adjust the balance factor&lt;&#x2F;strong&gt;. With everything
previously setup, we can test the first statement directly:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right_preserves_order&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;btree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; TestResult &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if !&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;discard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if !&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;discard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_bool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;equal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Given a BTree, we clone that to an AVL and right rotate the root node
and check if the resulting iterators still matches in order and
value. We also want to ignore empty trees and nodes that cannot not
be rotated since they do not add value. For that, we use the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;quickcheck#discarding-test-results-or-properties-are-polymorphic&quot;&gt;discard
test&lt;&#x2F;a&gt; mechanics of &lt;em&gt;quickcheck&lt;&#x2F;em&gt; with a &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;quickcheck&#x2F;0.8.5&#x2F;quickcheck&#x2F;struct.TestResult.html#method.discard&quot;&gt;quickcheck::TestResult&lt;&#x2F;a&gt; output
instead. If a test is &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;quickcheck&#x2F;0.8.5&#x2F;quickcheck&#x2F;struct.TestResult.html#method.discard&quot;&gt;discarded&lt;&#x2F;a&gt;, a new test sample is created instead
of ignoring it that would have eaten the maximum number of tests.
Same tactic applies to writing the left rotation.&lt;&#x2F;p&gt;
&lt;p&gt;First statement down, we now check if right rotation does tilt the
balance factor say by &lt;code&gt;2&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right_tils_balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; TestResult &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if !&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;discard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; root_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; balance_factor &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; root_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if !&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;discard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; tilted_factor &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; root_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_bool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; tilted_factor &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running just this test with &lt;code&gt;cargo test rotate_right_tilts_balance_factor&lt;&#x2F;code&gt;, this test fails on the list &lt;code&gt;[2, 0, 1]&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
&lt;&#x2F;span&gt;&lt;span&gt;     Running target&#x2F;debug&#x2F;deps&#x2F;avl_tree_set-ac5259255f5174fd
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;running 1 test
&lt;&#x2F;span&gt;&lt;span&gt;thread &amp;#39;set::properties::rotate_right_tilts_balance_factor&amp;#39; panicked at &amp;#39;[quickcheck] TEST FAILED. Arguments: ([2, 0, 1])&amp;#39;,
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;* More errors *&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Visualizing this counterexample:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;right-rotation-balance-factor-counterexample.jpg&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Given this diagram, the balance factor is changed from &lt;code&gt;2&lt;&#x2F;code&gt; to &lt;code&gt;-2&lt;&#x2F;code&gt;
that has a difference of &lt;code&gt;4&lt;&#x2F;code&gt; that fails the test. Even accommodating
that, the next counterexample is &lt;code&gt;[2, 0, 1, 3]&lt;&#x2F;code&gt; where the balance
factor is &lt;code&gt;1&lt;&#x2F;code&gt; turned to &lt;code&gt;-2&lt;&#x2F;code&gt; with a difference of &lt;code&gt;3&lt;&#x2F;code&gt;. With
subsequent exploration, the difference is always at least &lt;code&gt;2&lt;&#x2F;code&gt; but the
upper bound is unknown. This is where property based testing is
meaningful in expanding our empirical observation. Nonetheless, the
tilt still exists that proves that the rotation works although
weakly. We then update the condition to test a difference of at least
&lt;code&gt;2&lt;&#x2F;code&gt; to pass and apply a similar treatment to writing the left
rotation test.&lt;&#x2F;p&gt;
&lt;p&gt;To connect these two rotations in one property, what can we say about
those two operations when applied together? Can we say they are
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Inverse%5Ffunction&quot;&gt;inverse operations&lt;&#x2F;a&gt; that a right rotation undoes a left rotation or
vice-versa like with multiplication and division? Again, easily
verified:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_left_and_rotate_left_identity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; TestResult &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;discard&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rotated_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; root_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rotated_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; root_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        root_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        root_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        root_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;TestResult&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;from_bool&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotated_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Given a set, we clone that and rotate left then right or whichever
applies first, then check if it is the same structure. Running the
test proves it is valid since no breaking example can be found:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;   Compiling avl_tree_set v0.1.0 (&#x2F;home&#x2F;nobody&#x2F;avl_tree_set_rs)
&lt;&#x2F;span&gt;&lt;span&gt;    Finished dev [unoptimized + debuginfo] target(s) in 0.27s
&lt;&#x2F;span&gt;&lt;span&gt;     Running target&#x2F;debug&#x2F;deps&#x2F;avl_tree_set-ac5259255f5174fd
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;running 5 tests
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::rotate_left_and_rotate_left_identity ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::rotate_left_tilts_balance_factor ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::rotate_right_tilts_balance_factor ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::rotate_left_preserves_order ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::rotate_right_preserves_order ... ok
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;* Omitted other results *&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With confidence from those supporting statements, we are now ready to
finish our insert method.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;rebalancing-insert&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rebalancing-insert&quot; aria-label=&quot;Anchor link for: rebalancing-insert&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Rebalancing Insert&lt;&#x2F;h3&gt;
&lt;p&gt;If we have an imbalanced node, then wouldn&#x27;t one correct rotation
restore balance? It is a good first intuition but our small
counterexample on the tilt property disproves that. However, we can
apply another rotation to a child node before applying the main
rotation and it is enough to work. You can find a &lt;a href=&quot;https:&#x2F;&#x2F;www.cs.wcupa.edu&#x2F;rkline&#x2F;ds&#x2F;avl-trees.html&quot;&gt;mathematical proof
of induction here&lt;&#x2F;a&gt; if you are interested. Theory aside, the algorithm
can be thought of as branching paths:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Give a root node, if the balance factor is &lt;code&gt;2&lt;&#x2F;code&gt; (left heavy), we inspect
the left node.&lt;&#x2F;li&gt;
&lt;li&gt;If the left node has a balance factor of &lt;code&gt;1&lt;&#x2F;code&gt; (left heavy), we just
right rotate on the root node.&lt;&#x2F;li&gt;
&lt;li&gt;Otherwise, we left rotate this inner left node and right rotate
the root node.&lt;&#x2F;li&gt;
&lt;li&gt;Going back to the root node, if the balance factor is instead &lt;code&gt;-2&lt;&#x2F;code&gt;
(right heavy), we inspect the right node.&lt;&#x2F;li&gt;
&lt;li&gt;If the right node has a balance factor of &lt;code&gt;-1&lt;&#x2F;code&gt; (right heavy), we just
left rotate the root node.&lt;&#x2F;li&gt;
&lt;li&gt;Otherwise, we right rotate the inner right node and left rotate
the root node.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Translating this into code is rather direct with pattern matching:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Root is right heavy
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Inner node is left heavy
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Root is left heavy
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Inner node is right heavy
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== -&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rotate_right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_ =&amp;gt; false&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We directly integrate this method back to &lt;code&gt;.insert&lt;&#x2F;code&gt; as planned:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut *&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Right here
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To test the rebalancing property, we assert that every node should
not be imbalanced which is similar to the height test:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balanced_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;u16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    all&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;abs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running this and all prior test specially with the height and
iterator property proves that our tree is balanced after every
insert:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;   Compiling avl_tree_set v0.1.0 (&#x2F;home&#x2F;nobody&#x2F;avl_tree_set_rs)
&lt;&#x2F;span&gt;&lt;span&gt;    Finished dev [unoptimized + debuginfo] target(s) in 0.27s
&lt;&#x2F;span&gt;&lt;span&gt;     Running target&#x2F;debug&#x2F;deps&#x2F;avl_tree_set-ac5259255f5174fd
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;running 3 tests
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::balanced_nodes ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::node_height ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::iterator_parity ... ok
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;* Omitting other tests *&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We now have a self-balancing tree and can now proclaim victory.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;reflection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reflection&quot; aria-label=&quot;Anchor link for: reflection&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Reflection&lt;&#x2F;h3&gt;
&lt;p&gt;This was a challenging section. In particular with rotation, it was
hard to negotiate with the compiler how to move the nodes correctly.
In my darkest hour, I was truly tempted to use &lt;code&gt;unsafe&lt;&#x2F;code&gt; to move the
pointers directly (if I could) as &lt;em&gt;C&lt;&#x2F;em&gt; code seems so deceptively easy;
however, I would increase the error margin&#x2F;surface of the design.
This problem was less about writing and technicalities but more about
understanding that requires patience and rigor. After this, I stopped
resisting the compiler and started to accept it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deletion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deletion&quot; aria-label=&quot;Anchor link for: deletion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Deletion&lt;&#x2F;h2&gt;
&lt;p&gt;After all the struggle with &lt;code&gt;.insert&lt;&#x2F;code&gt;, the deletion method, &lt;code&gt;.take&lt;&#x2F;code&gt;,
is surprisingly the harder of the two methods. When deleting nodes, we
have to handle three cases for the deleted node to maintain the tree
structure: no children, one child and two children. This section is a
culmination of all the techniques.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#delete-method&quot;&gt;Delete Method&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#zero-or-one-child&quot;&gt;Zero Or One Child&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#two-children&quot;&gt;Two Children&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#deletion-testing&quot;&gt;Deletion Testing&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;delete-method&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#delete-method&quot; aria-label=&quot;Anchor link for: delete-method&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Delete Method&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Parity:&lt;&#x2F;strong&gt; &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;collections&#x2F;btree%5Fset&#x2F;struct.BTreeSet.html#method.take&quot;&gt;BTreeSet::take&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you noticed &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;option&#x2F;enum.Option.html#method.take&quot;&gt;Option::take&lt;&#x2F;a&gt; when rotating nodes, it returns the owned
value and internally replaced by a &lt;code&gt;None&lt;&#x2F;code&gt; value. For our tree, our
&lt;code&gt;.take&lt;&#x2F;code&gt; method follows the same convention. Here is the whole
procedure to delete a node:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Starting from the root node or with a current node&lt;&#x2F;li&gt;
&lt;li&gt;Move to the left node if the value is less than the current node,
right if greater&lt;&#x2F;li&gt;
&lt;li&gt;Do this until you have a node equal to that value, otherwise stop&lt;&#x2F;li&gt;
&lt;li&gt;Delete that node and return the value&lt;&#x2F;li&gt;
&lt;li&gt;If the deleted node has no children, stop&lt;&#x2F;li&gt;
&lt;li&gt;If the deleted node has one child, substitute that child to
the removed node&lt;&#x2F;li&gt;
&lt;li&gt;If the deleted node has two children, substitute the deleted node
with the leftmost child of the right subtree and link the orphaned
left child to the left child of this new node&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;These steps are short to write but are deceptively tricky but the
first few are done in the same manner as we did with &lt;code&gt;.insert&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_ptrs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1. Starting from the root node or with a current node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 2. Move to the left node if the value is less than the current node,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F;    right if greater
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cmp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Less &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                prev_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Equal &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 3a. Do this until you have a node equal to that value, ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                target_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Greater &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                prev_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 3b. ... otherwise stop
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return None&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 4. Delete that node and return the value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; taken_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= ???&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Retrace the path and update them accordingly
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut *&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;taken_value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is the &lt;code&gt;.insert&lt;&#x2F;code&gt; method with some modifications. We need the
node before &lt;code&gt;.insert&lt;&#x2F;code&gt; stops, so the &lt;code&gt;target_value&lt;&#x2F;code&gt; captures that
idea. It is also wrapped in an &lt;code&gt;Option&lt;&#x2F;code&gt; to see check if a node is
found and stop otherwise. Also, we use &lt;code&gt;taken_value&lt;&#x2F;code&gt; as the return
value after deleting the node. Before exiting, we make sure the
tracked nodes are updated before we leave.&lt;&#x2F;p&gt;
&lt;p&gt;To emphasize, deleting or relocating nodes is a tricky operation
since it potentially moves many nodes. We exercise care as we handle
each case and consider height and balance if needed. Failing to
update nodes correctly will lead to subtle memory issues such as
mentioned in &lt;code&gt;.balance_factor&lt;&#x2F;code&gt; and dropped nodes. We naturally start
with the safer case of zero or one child for the deleted node.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;zero-or-one-child&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-or-one-child&quot; aria-label=&quot;Anchor link for: zero-or-one-child&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Zero Or One Child&lt;&#x2F;h3&gt;
&lt;p&gt;The case of deleting an empty node is about detaching the target
node. With one child either left or right, we still delete the node
and promote that child in its place. Weirdly, the case of deleting
one child is easier than deleting no child:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Deleting the node here
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; taken_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;||&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Deleting an no children
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;unimplemented!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The tactic of the deleting node with &lt;code&gt;replace&lt;&#x2F;code&gt; allows us to get
ownership of the node that gives us ownership of the value we want
to return. Since a child tree was promoted, no height or rebalancing
is needed for the replaced node.&lt;&#x2F;p&gt;
&lt;p&gt;With the one child node, we can get a node and replace the deleted
node with that. With no children, we cannot use the same tactic.
Instead, we have to go the parent node and delete if from there:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1a. Get parent node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev_ptr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut *&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1b. Determine which node to remove: left or right node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 2. Update parent node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 3. Return value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        inner_value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1c. ... otherwise it is the parent and take the root node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Given the parent node, we determine which left or right node to take
by checking for equality once again. We could create an extra enum or
flag to remember the path, but it is a minor trade-off than adding
state. Either way, we take that node and returns its value; however,
since the parent node had a child removed, we update it accordingly.
Lastly, it is possible no previous nodes were traversed that implies
it is an isolated root node to delete which is easily handled.
Another case where pattern matching helps with illuminating edge
cases. With some confidence in our reasoning, we handle the hard case
of two children.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;two-children&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#two-children&quot; aria-label=&quot;Anchor link for: two-children&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Two Children&lt;&#x2F;h3&gt;
&lt;p&gt;For two children, we replace the deleted node with the node of the
next value or the leftmost child of the right child of the deleted
node:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;node-deletion.jpg&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Describing the algorithm:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Starting with the right child of the target node&lt;&#x2F;li&gt;
&lt;li&gt;Keep moving the current node to the left child until it has none&lt;&#x2F;li&gt;
&lt;li&gt;Replace the target node value with the current node value&lt;&#x2F;li&gt;
&lt;li&gt;Replace the current node with the right child if it has one&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Applying all the prior techniques for this final challenge:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; taken_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;||&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 1. Starting with the right child of the target node
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; next_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; We also keep track of the parent nodes to update the height
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_ptrs &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*mut &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlNode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 2. Keep moving the current node to the left child until it has none
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next_left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; next_tree &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; next_left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            inner_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut **&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next_left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        next_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; next_left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; We don&amp;#39;t use next_tree but instead the tracked nodes as basis
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parent_left_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut *&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inner_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() };
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; leftmost_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parent_left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 3. Replace the target node value with the current node value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; leftmost_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; 4. Replace the current node with the right child if it has
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; parent_left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; leftmost_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Updates the nodes in order
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    parent_left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    parent_left_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= unsafe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut *&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_ptr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    inner_value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It is quite a mouthful and the last bit of complex code. It is like
an inner delete based on the child right tree that follows the same
conventions. After promoting a bottom node, we have an interesting
path of nodes to update and balance: the parent of the leftmost child
up to the originating target node. Stepping through the code should
be straightforward although more complex.&lt;&#x2F;p&gt;
&lt;p&gt;For the astute reader, we have one final edge case as the code above
assumes that at least one tracked node always exist by the
declaration of &lt;code&gt;parent_left_node&lt;&#x2F;code&gt; that only happens when the direct
right node has no left child based on the diagram. In that simpler
yet similar case, we replace that node with the right child if has
any:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;is_none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_node &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_tree&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; inner_value &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    replace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    inner_value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Previous case
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With that final edge case, the &lt;code&gt;.take&lt;&#x2F;code&gt; method is complete and ready
to test.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;deletion-testing&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deletion-testing&quot; aria-label=&quot;Anchor link for: deletion-testing&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Deletion Testing&lt;&#x2F;h3&gt;
&lt;p&gt;To test deletion, we need to test for existence that we do by
finally implementing a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;collections&#x2F;btree%5Fset&#x2F;struct.BTreeSet.html#method.contains&quot;&gt;BTreeSet::contains&lt;&#x2F;a&gt; method. With everything
done so far, this is a relief:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;a + Ord&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt; {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;contains&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cmp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Less &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Equal &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;Ordering&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;Greater &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    current_tree &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;};
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;false
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Given an equal AVL and BTree set, &lt;code&gt;.contains&lt;&#x2F;code&gt; should be the same
for every value&lt;&#x2F;strong&gt;. Testing &lt;code&gt;.contains&lt;&#x2F;code&gt; will have a little twist. We
want to have a more defined positive and negative test cases, so when
cloning a list of numbers, we only include the even numbers as
positive cases and odd as negatives:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;contains_parity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; evens &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; avl_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; evens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; evens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    all&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;avl_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;contains&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;contains&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As long as we have a subset of data, it is valid. Also we do not need
to filter test cases so we revert back to the familiar test template.
Assuming the test works, we use the same template of positive and
negative testing for &lt;code&gt;.take&lt;&#x2F;code&gt; as well. Thanks to the previous
sections, we establish our tree has three core properties:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Ordering&lt;&#x2F;li&gt;
&lt;li&gt;Height&lt;&#x2F;li&gt;
&lt;li&gt;Balanced&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;If we prove that each property holds after several deletions, it
shows our tree is balanced and correct. Writing a separate test for
each one might be more verbose, but it makes failing properties
easier to reason about.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Given an equal AVL and BTree set, &lt;code&gt;.take&lt;&#x2F;code&gt; should be the same for
every value&lt;&#x2F;strong&gt;. Before we check the core properties, we test if the
interface is correct:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take_parity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; odds &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; avl_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; odds&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; odds&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    all&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;avl_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Establishing the methods are equal, we then test the first property
which is our comfortable iterator equality test.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take_iterator_parity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;i16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fives &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; avl_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; five &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fives &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#afc0fd;&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;avl_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;five&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;five&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;));
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    equal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;avl_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from order, this guarantees our deletion does delete the
correct nodes and preserves the others. Next one is height via node
iterator:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take_height_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;isize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; negatives &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; negative &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; negatives &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;negative&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    all&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;height &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;())
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;})
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Having correct heights is a good sign that nodes are updated
properly. Topping it off, the balance factor is checked with the same
mechanics:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;quickcheck&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take_balanced_nodes&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;) -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;bool &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; odds &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cloned&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; odd &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; odds &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;odd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    all&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node_iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(), |&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;balance_factor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;abs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running the tests one last time proves victorious:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;   Compiling avl_tree_set_rs v0.1.0 (&#x2F;home&#x2F;nobody&#x2F;avl_tree_set_rs)
&lt;&#x2F;span&gt;&lt;span&gt;    Finished dev [unoptimized + debuginfo] target(s) in 0.12s
&lt;&#x2F;span&gt;&lt;span&gt;     Running target&#x2F;debug&#x2F;deps&#x2F;avl_tree_set_rs-551042db094327bb
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;running 4 tests
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;* Passing previous tests *&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::take_height_nodes ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::take_balanced_nodes ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::take_iterator_parity ... ok
&lt;&#x2F;span&gt;&lt;span&gt;test set::properties::take_parity ... ok
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;reflection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reflection&quot; aria-label=&quot;Anchor link for: reflection&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Reflection&lt;&#x2F;h3&gt;
&lt;p&gt;Originally, I used &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-rspec&#x2F;rspec&quot;&gt;rspec&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cksac&#x2F;fake-rs&quot;&gt;fake-rs&lt;&#x2F;a&gt; as my testing strategy that gave
me a good quality test workflow. In writing this article, I moved to
&lt;em&gt;quickcheck&lt;&#x2F;em&gt; as a better paradigm to test abstract data structure.
Aside from being easier to write and iterate, porting my tests to
this paradigm gave me failing tests specially on this dangerous
method. That was a good catch that also gave me better and smaller
counterexamples to find the memory issues in my code.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from property based testing against a memory issue, working on
deletion is not that technical or hard. The prior two sections have
trained me to implement the algorithm with no fuzz. I am at peace, I
am productive.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;beyond-parity&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#beyond-parity&quot; aria-label=&quot;Anchor link for: beyond-parity&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Beyond Parity&lt;&#x2F;h2&gt;
&lt;p&gt;In this article, we are done with the major goals of our project.
During my spare time, I implemented every struct method (not traits)
from &lt;code&gt;BTreeSet&lt;&#x2F;code&gt; to &lt;code&gt;AvlTreeSet&lt;&#x2F;code&gt; as practice. While insertion and
deletion were the hardest methods, everything else was cakewalk, so
checkout the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;avl%5Ftree%5Fset%5Frs&quot;&gt;code repository&lt;&#x2F;a&gt; if completion piques your interest. This
optional section is about a few things I found interesting.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#benchmark&quot;&gt;Benchmark&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;understanding-rust-through-avl-trees&#x2F;#memory-safety&quot;&gt;Memory Safety&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;benchmark&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#benchmark&quot; aria-label=&quot;Anchor link for: benchmark&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Benchmark&lt;&#x2F;h3&gt;
&lt;p&gt;As a minor fancy, how does our implementation perform against the
standard library? Consulting a &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;1.16.0&#x2F;book&#x2F;benchmark-tests.html&quot;&gt;benchmarking chapter&lt;&#x2F;a&gt;, we can benchmark
the insert operation by generating random numbers and timing it using
this shortened snippet:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;bench&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setup_random_btree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Bencher&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rng &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;thread_rng&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;BTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rng&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;gen&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;bench&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setup_random_avltree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt; Bencher&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rng &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;thread_rng&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(|| {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rng&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;gen&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;());
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;});
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here, we use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-random&#x2F;rand&quot;&gt;rand&lt;&#x2F;a&gt; crate to generate random numbers outside of
&lt;em&gt;quickcheck&lt;&#x2F;em&gt; to populate our set and the base set. We conveniently
have a builtin cargo &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;cargo&#x2F;commands&#x2F;cargo-bench.html&quot;&gt;bench&lt;&#x2F;a&gt; command that works out of the box, so we
can just run &lt;code&gt;cargo bench&lt;&#x2F;code&gt; and watch:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;    Finished release [optimized] target(s) in 0.04s
&lt;&#x2F;span&gt;&lt;span&gt;     Running target&#x2F;release&#x2F;deps&#x2F;avl_tree_set_rs-e74d4a8db1cacec9
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;running 17 tests
&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;* Passing prior tests *&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;test bench::setup_random_avltree_set ... bench:       1,800 ns&#x2F;iter (+&#x2F;- 517)
&lt;&#x2F;span&gt;&lt;span&gt;test bench::setup_random_btree_set   ... bench:         529 ns&#x2F;iter (+&#x2F;- 72)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In this run, our toy set has insert performance that is more or less
four times slower than what &lt;em&gt;Rust&lt;&#x2F;em&gt; has matured. It would be strange
if it was significantly close. As simple as &lt;code&gt;.insert&lt;&#x2F;code&gt; is, the
bottleneck possibly lies in the rotations since they use many &lt;code&gt;.take&lt;&#x2F;code&gt;
or memory operations which could be further optimized. We now have a
general sense of relative performance for our implementation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;memory-safety&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#memory-safety&quot; aria-label=&quot;Anchor link for: memory-safety&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Memory Safety&lt;&#x2F;h3&gt;
&lt;p&gt;Aside from the promise of safety, can we further prove our library
has no memory leaks? Asking this question lead me to &lt;a href=&quot;https:&#x2F;&#x2F;creativcoder.dev&#x2F;checking-memory-leaks-ffi&quot;&gt;this article&lt;&#x2F;a&gt; and
&lt;a href=&quot;http:&#x2F;&#x2F;valgrind.org&#x2F;&quot;&gt;valgrind&lt;&#x2F;a&gt;: a memory error detector. Installing it and creating a small
main &lt;code&gt;bin.rs&lt;&#x2F;code&gt; file that generates a set and removes every element:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;avl_tree_set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;pub fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; set &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10_000 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as u32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#afc0fd;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;::&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;AvlTreeSet&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;gt;&amp;gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10_000 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        set&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Compiling it into an executable via &lt;code&gt;cargo build&lt;&#x2F;code&gt; and running
&lt;code&gt;valgrind --leak-check=full .&#x2F;target&#x2F;debug&#x2F;avl_tree_set&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;==25728== Memcheck, a memory error detector
&lt;&#x2F;span&gt;&lt;span&gt;==25728== Copyright (C) 2002-2017, and GNU GPL&amp;#39;d, by Julian Seward et al.
&lt;&#x2F;span&gt;&lt;span&gt;==25728== Using Valgrind-3.16.0.GIT and LibVEX; rerun with -h for copyright info
&lt;&#x2F;span&gt;&lt;span&gt;==25728== Command: .&#x2F;target&#x2F;debug&#x2F;avl_tree_set
&lt;&#x2F;span&gt;&lt;span&gt;==25728==
&lt;&#x2F;span&gt;&lt;span&gt;==25728==
&lt;&#x2F;span&gt;&lt;span&gt;==25728== HEAP SUMMARY:
&lt;&#x2F;span&gt;&lt;span&gt;==25728==     in use at exit: 0 bytes in 0 blocks
&lt;&#x2F;span&gt;&lt;span&gt;==25728==   total heap usage: 101,389 allocs, 101,389 frees, 4,198,985 bytes allocated
&lt;&#x2F;span&gt;&lt;span&gt;==25728==
&lt;&#x2F;span&gt;&lt;span&gt;==25728== All heap blocks were freed -- no leaks are possible
&lt;&#x2F;span&gt;&lt;span&gt;==25728==
&lt;&#x2F;span&gt;&lt;span&gt;==25728== For lists of detected and suppressed errors, rerun with: -s
&lt;&#x2F;span&gt;&lt;span&gt;==25728== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Having an external tool check our small executable reveals no memory
leaks that is comforting and assuring along with passing tests. With
the code before I started writing this article, I followed the same
steps above with passing tests, I ran into the following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;=3010== &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;Memcheck,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; a memory error detector
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;=3010== &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;Copyright&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; (C) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;2002-2017,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; and GNU GPL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;d, by Julian Seward et al.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010== Using Valgrind-3.16.0.GIT and LibVEX; rerun with -h for copyright info
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010== Command: .&#x2F;target&#x2F;debug&#x2F;avl_tree_set
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010== Invalid read of size 8
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    at 0x1104BE: core::option::Option&amp;lt;T&amp;gt;::as_ref (option.rs:239)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    by 0x10EF32: avl_tree_set::tree::AvlNode&amp;lt;T&amp;gt;::left_height (tree.rs:16)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    by 0x10F942: avl_tree_set::tree::AvlNode&amp;lt;T&amp;gt;::update_height (tree.rs:24)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    by 0x112ABA: avl_tree_set::set::AvlTreeSet&amp;lt;T&amp;gt;::take (set.rs:107)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    by 0x11113A: avl_tree_set::main (bin.rs:7)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    by 0x113E6F: std::rt::lang_start::{{closure}} (rt.rs:64)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    by 0x11A9B2: {{closure}} (rt.rs:49)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    by 0x11A9B2: std::panicking::try::do_call (panicking.rs:294)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;==3010==    by 0x11C319: __rust_maybe_catch_panic (lib.rs:82)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;* More errors down below *&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Conflicted with passing tests and a memory issue I could not
replicate in test, my denial thought that &lt;code&gt;valgrind&lt;&#x2F;code&gt; was broken
instead. Switching to property based test helped in finding test
cases that causes memory issues. The offending code happens with the
deletion of a leaf node in the old code:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if let Some&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev_ptr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prev_ptrs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; snip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    prev_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;&#x2F; Memory issue
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;update_height&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    target_node&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rebalance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    inner_value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;take&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Recall in the no children case, we detach the &lt;code&gt;target_node&lt;&#x2F;code&gt; and
updated the &lt;code&gt;prev_node&lt;&#x2F;code&gt; instead. I forgot about that assumption and
carelessly updated the deleted node and remember that &lt;code&gt;prev_node&lt;&#x2F;code&gt;
comes from an &lt;code&gt;unsafe&lt;&#x2F;code&gt; pointer that breaks the single mutable
reference rule. Perhaps, &lt;code&gt;target_node&lt;&#x2F;code&gt; has a child that that was part
of the rotation and became a dangling pointer afterwards. Although
our use of &lt;code&gt;unsafe&lt;&#x2F;code&gt; was seemingly safe, my tests did not catch that.
As proud as I was of my old tests, having external tools offer
insights outside my ego and bias. So even when the code compiles and
passes, it is good to check running code.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reflecting-on-rust&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reflecting-on-rust&quot; aria-label=&quot;Anchor link for: reflecting-on-rust&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Reflecting On Rust&lt;&#x2F;h2&gt;
&lt;p&gt;Although not a shining example of &lt;em&gt;AVL Trees&lt;&#x2F;em&gt;, it has been a good
first project. I believe it was a good vertical slice of &lt;em&gt;Rust&lt;&#x2F;em&gt;. In
the beginning, understanding, patience and perseverance is required
with the new idioms and designs and specially for the compiler.
Working through the code, familiarizing new functions and traits and
grasping lifetimes were the only difficulty. Reflecting on its style,
it is a happy union&#x2F;mix between object oriented and functional.
Overall, &lt;em&gt;Rust&lt;&#x2F;em&gt; is overall a challenging yet rewarding language with
little to complain syntactically.&lt;&#x2F;p&gt;
&lt;p&gt;Looking back on &lt;em&gt;Ruby&lt;&#x2F;em&gt; and &lt;em&gt;Elixir&lt;&#x2F;em&gt;, I frequently find myself looking
for the &lt;code&gt;&amp;amp;&lt;&#x2F;code&gt; or borrow operator in the variables. Working with the
&lt;em&gt;Borrow Checker&lt;&#x2F;em&gt;, I believe, has been a positive experience although
rigorous. As such, I realize that this intricate mechanism cannot
easily be ported to other language without design considerations. If
&lt;em&gt;Elixir&lt;&#x2F;em&gt; had &lt;em&gt;Rust&lt;&#x2F;em&gt;&#x27;s mechanics, I doubt it would be as popular or as
ergonomic in its (almost) actor&#x2F;process model. (Perhaps &lt;a href=&quot;https:&#x2F;&#x2F;www.ponylang.io&#x2F;&quot;&gt;Pony language&lt;&#x2F;a&gt;
will be the evolved version when it matures?) As a modern observation,
languages that value a form application safety (memory, data,
correctness) tends to have higher learning curves and barriers to
entry because of the required mindset and philosophies. With &lt;a href=&quot;https:&#x2F;&#x2F;blog.rust-lang.org&#x2F;2017&#x2F;03&#x2F;02&#x2F;lang-ergonomics.html&quot;&gt;better
ergonomics&lt;&#x2F;a&gt;, documentation and tooling, the learning curve is somewhat
balanced. So despite its accessibility, &lt;em&gt;Rust&lt;&#x2F;em&gt; definitely deserves
attention and discussion for its rare core value of safety.&lt;&#x2F;p&gt;
&lt;p&gt;This was a long article to prepare and write, so thank you for making
it to the end. I hope you found the journey meaningful or valuable in
some way. What is the next learning project? Aside from reading &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;nomicon&#x2F;borrow-splitting.html?highlight=Tree#splitting-borrows&quot;&gt;The
Rustonomicon&lt;&#x2F;a&gt; first, here are some project ideas:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kanaka&#x2F;mal&quot;&gt;Make a Lisp&lt;&#x2F;a&gt; in Rust&lt;&#x2F;strong&gt;
: Implementing a (LISP) language is a dream.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;GraphQL Server&lt;&#x2F;strong&gt;
: Is &lt;em&gt;Rust&lt;&#x2F;em&gt; good for the usual web development or microservices?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Web Scraping&#x2F;Crawling&lt;&#x2F;strong&gt;
: A good opportunity to learn asynchronous and concurrent operations.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;C Interop&lt;&#x2F;strong&gt;
: How good is the workflow in integrating with native libraries?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Web Assembly&lt;&#x2F;strong&gt;
: A backend language in the browser is interesting&lt;&#x2F;p&gt;
&lt;p&gt;As a newcomer, I am excited with the new doors &lt;em&gt;Rust&lt;&#x2F;em&gt; has opened for
me. For now, I feel ecstatic in writing a valid library that I am
confidently safer than it would be in &lt;em&gt;C&lt;&#x2F;em&gt;. That is good enough for me.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Exploring Emacs chart Library</title>
          <pubDate>Sat, 15 Apr 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/exploring-emacs-chart-library/</link>
          <guid>https://fnlog.dev/dev/exploring-emacs-chart-library/</guid>
          <description>&lt;h2 id=&quot;bar-charts&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bar-charts&quot; aria-label=&quot;Anchor link for: bar-charts&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Bar Charts&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Bar%5Fchart#p-search&quot;&gt;Bar Charts&lt;&#x2F;a&gt; is a simple way to visualize grouped data through colorful
rectangles. In the world of text buffers and shell output, it is
surprising that Emacs has a library to draw colored rectangles:
&lt;code&gt;chart&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;chart&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chart&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bar&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quickie
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;vertical &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Favorite Type of Movie&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Type &amp;amp; Title
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Comedy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Action&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Romance&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Drama&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Sci-Fi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Genre&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Keys &amp;amp; Label
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4 5 6 1 4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;People&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;                                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Values &amp;amp;  Label
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;exploring-emacs-chart-library&#x2F;cover.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;As the screenshot shows above, it is not sophisticated enough to
warrant deep examination but still impressive within the realm of text
buffers. The context of being builtin leads to fascinating queries
about the Emacs interpreter such as &lt;code&gt;memory-usage&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;exploring-emacs-chart-library&#x2F;memory-usage.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;If you want to try it out, you can use the command &lt;code&gt;load-library&lt;&#x2F;code&gt; to
import &lt;code&gt;chart&lt;&#x2F;code&gt;. It defines the following demo command for exploration:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;chart-emacs-storage&lt;&#x2F;code&gt;
: This charts the output of &lt;code&gt;memory-usage&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;chart-emacs-lists&lt;&#x2F;code&gt;
: Like &lt;code&gt;chart-emacs-storage&lt;&#x2F;code&gt;, this counts &lt;em&gt;buffers&lt;&#x2F;em&gt;, &lt;em&gt;frames&lt;&#x2F;em&gt;,
&lt;em&gt;processes&lt;&#x2F;em&gt;, &lt;em&gt;faces&lt;&#x2F;em&gt; and &lt;em&gt;x-display&lt;&#x2F;em&gt; within the Emacs session&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;chart-rmail-from&lt;&#x2F;code&gt;
: With &lt;code&gt;rmail&lt;&#x2F;code&gt;, it groups user sender occurrences by mail&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;chart-space-usage&lt;&#x2F;code&gt;
: After selecting a directory, it shows the disk usage by file type
within said directory&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;chart-file-count&lt;&#x2F;code&gt;
: After selecting a directory, it displays file type occurrences
within the directory&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;chart-test-it-all&lt;&#x2F;code&gt;
: A chart testing positive and negative values&lt;&#x2F;p&gt;
&lt;p&gt;Aside from those demo commands, how can we use it and make a chart?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;making-a-chart&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#making-a-chart&quot; aria-label=&quot;Anchor link for: making-a-chart&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Making A Chart&lt;&#x2F;h2&gt;
&lt;p&gt;After some reading and exploration, the starting command or function
to understand this library is &lt;code&gt;chart-bar-quickie&lt;&#x2F;code&gt;, the rest seem
internal. Although this function has a total of eight arguments which
two are optional, it encapsulates everything needed to make the chart
including labels and data rather than instantiating &lt;em&gt;classes&lt;&#x2F;em&gt; and
&lt;em&gt;objects&lt;&#x2F;em&gt;. A small snippet to elaborate:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chart&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comparator&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&amp;lt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A sample comparator for the values.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Each parameter is a key-value cos pair and should function as a
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;comparator like `&amp;lt;&amp;#39;, `=&amp;#39;, or `&amp;gt;&amp;#39;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;,left&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key . ,left&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; left is a cons of key and value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;,right&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key . ,right&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ditto with right
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value right&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chart&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bar&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quickie
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;vertical                           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Chart direction, either &amp;#39;vertical or &amp;#39;horizontal
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Chart Title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;                       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Chart title
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Alpha&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Beta&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Gamma&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Delta&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; X-Axis values or keys
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;X Line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;                            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; X-Axis label
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4 3 2 1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Y-Axis values
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Y Line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;                            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Y-Axis label
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Optional
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3                                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Max value allowed, anything higher is not shown
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;chart-comparator-&amp;lt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Sorting or ordering function
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;exploring-emacs-chart-library&#x2F;sample.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Once evaluated, this creates a new buffer based on the title and
renders the bar chart there. The display itself is inert unlike
&lt;code&gt;tabulated-list-mode&lt;&#x2F;code&gt; or any special buffer modes, so do not expect
special key bindings or commands that sort, zoom, refresh the chart
out of the box. Aside from tempering expectations, all the major (if
not all) functionality is within that function. (Sadly, looking any
deeper does not yield any more insights.) Lastly, the only caveat here
is that the size of the keys and values should be the same which is
natural as it matches each key with the corresponding value.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;demonstration&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#demonstration&quot; aria-label=&quot;Anchor link for: demonstration&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Demonstration&lt;&#x2F;h2&gt;
&lt;p&gt;As an example, let us tackle a statistical query on a dataset. We will
play with the &lt;a href=&quot;https:&#x2F;&#x2F;vincentarelbundock.github.io&#x2F;Rdatasets&#x2F;csv&#x2F;datasets&#x2F;HairEyeColor.csv&quot;&gt;Hair Eye Color dataset&lt;&#x2F;a&gt; which looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;&amp;quot;,&amp;quot;Hair&amp;quot;,&amp;quot;Eye&amp;quot;,&amp;quot;Sex&amp;quot;,&amp;quot;Freq&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;1&amp;quot;,&amp;quot;Black&amp;quot;,&amp;quot;Brown&amp;quot;,&amp;quot;Male&amp;quot;,32
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;2&amp;quot;,&amp;quot;Brown&amp;quot;,&amp;quot;Brown&amp;quot;,&amp;quot;Male&amp;quot;,53
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;3&amp;quot;,&amp;quot;Red&amp;quot;,&amp;quot;Brown&amp;quot;,&amp;quot;Male&amp;quot;,10
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;4&amp;quot;,&amp;quot;Blond&amp;quot;,&amp;quot;Brown&amp;quot;,&amp;quot;Male&amp;quot;,3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;5&amp;quot;,&amp;quot;Black&amp;quot;,&amp;quot;Blue&amp;quot;,&amp;quot;Male&amp;quot;,11
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Before we query, let us import the data which is a good exercise for
CSV parsing in Emacs:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq csv&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dataset&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expand&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;HairEyeColor.csv&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;Downloads&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read-lines &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Take your pick: custom, find-file, f-read-text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;temp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;contents&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;literally file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;decode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;coding&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;region &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;utf&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;8 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read-csv-field &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Remove the pesky enclosed double quoting
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;cond
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;zerop &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &amp;quot;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-equal &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties field &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-equal &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties field &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties field &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;number field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read-csv-line &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;raw&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fields &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; This assumes no rogue commas need escaping
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string line &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;read-csv-field&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; raw&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fields&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read-csv-file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;read-csv-line &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lines file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq dataset &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;csv&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file csv&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dataset&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&amp;quot;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Hair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Eye&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Sex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Freq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Black&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Brown&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Male&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Brown&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Brown&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Male&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;53&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Red&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Brown&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Male&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Blond&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Brown&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Male&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Libraries exist for this purpose such as &lt;code&gt;csv&lt;&#x2F;code&gt;, &lt;code&gt;el-csv&lt;&#x2F;code&gt; or
&lt;code&gt;parse-csv&lt;&#x2F;code&gt; and utilities like &lt;code&gt;f&lt;&#x2F;code&gt; or &lt;code&gt;parsec&lt;&#x2F;code&gt; but doing it yourself
is an occasional opportunity to review the basics. With that handled,
what can we ask of the data? &lt;strong&gt;What is the frequency of eye colors?&lt;&#x2F;strong&gt;
Before that, we need to group the data:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq headers &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car dataset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Only mentioned, not needed
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      records &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr dataset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group-by &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A quick write on -group-by
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapc
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall f x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;assoc key groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;unless&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; key&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons key &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq key&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;assoc key groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setcdr key&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr key&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group-records-by-eye-color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;records&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;raw&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;by &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;partially &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;nth &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; records&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;,eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color . ,eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;records&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;frequencies &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Extract frequencies and collect it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;partially &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;nth &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;records&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;frequencies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Shiv for sum
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      raw&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;records&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;by&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color records&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Green&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Hazel&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;93&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Blue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;215&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Brown&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;220&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After writing the extraction, getting the bar chart is
straightforward.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chart&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bar&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quickie
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;horizontal
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Eye Colors&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;car&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Colors&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;cdr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Frequency&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;exploring-emacs-chart-library&#x2F;eye-color.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Neat but let&#x27;s arrange it by descending order:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f op&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Haskell&amp;#39;s on operator
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f f&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Sad that parameters aren&amp;#39;t lexically scoped here
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;op op&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall op &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall f left&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall f right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;chart&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bar&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quickie
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;horizontal
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Eye Colors - Descending&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;car&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Colors&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;cdr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; eye&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;groups&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Frequency&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;cdr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A comparator lambda also works but done for variety
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;exploring-emacs-chart-library&#x2F;eye-color-descending.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Looking at it, &lt;em&gt;brown&lt;&#x2F;em&gt; and &lt;em&gt;blue&lt;&#x2F;em&gt; eye colors are quite frequent.
Nothing groundbreaking or epic. How about applying the same process
with &lt;em&gt;hair color&lt;&#x2F;em&gt;? We get the following chart:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;exploring-emacs-chart-library&#x2F;hair-color.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;With &lt;em&gt;hair color&lt;&#x2F;em&gt; as the variable, &lt;em&gt;brown&lt;&#x2F;em&gt; and &lt;em&gt;blonds&lt;&#x2F;em&gt; are many.
Nothing fancy. We could change the variable into &lt;em&gt;gender&lt;&#x2F;em&gt; but nothing
more would be gained. The real question for any visualization is &lt;strong&gt;what
does it mean?&lt;&#x2F;strong&gt; Rather, what insights can we interpret from the data?
Since it is a sample, it might not mean anything nor does it have to.
This is a library exploration, not a statistical lesson that is beyond
scope.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Strangely, that is all there is to it: &lt;strong&gt;a neat and easy builtin bar
chart library.&lt;&#x2F;strong&gt; Since it is not pixel precise, it does not compete
with the modern visualizations tools or languages such as &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Python%5F%2528programming%5Flanguage%2529&quot;&gt;Python&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;www.r-project.org&#x2F;&quot;&gt;R&lt;&#x2F;a&gt; or
&lt;a href=&quot;https:&#x2F;&#x2F;www.haskell.org&#x2F;&quot;&gt;Haskell&lt;&#x2F;a&gt; although it does not have to. It simply is nice to have and
fun to know.&lt;&#x2F;p&gt;
&lt;p&gt;Interestingly, if bar charts can be made with ASCII, how about pies or
bubbles. Can Emacs be a modern visualization tool?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Exploring Emacs rx Macro</title>
          <pubDate>Thu, 30 Mar 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/exploring-emacs-rx-macro/</link>
          <guid>https://fnlog.dev/dev/exploring-emacs-rx-macro/</guid>
          <description>&lt;h2 id=&quot;regular-expression&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#regular-expression&quot; aria-label=&quot;Anchor link for: regular-expression&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Regular Expression&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Some people, when confronted with a problem, think &amp;quot;I know, I&#x27;ll use
regular expressions.&amp;quot; Now they have two problems.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt; - &lt;em&gt;Jamie Zawinski&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Regular%5Fexpression&quot;&gt;Regular Expressions&lt;&#x2F;a&gt; are difficult to write and maintain. Instead of
harping about the problems, I want to explore what Emacs offers to
make writing them easier. In particular, I want to tackle the &lt;a href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;rx&quot;&gt;rx&lt;&#x2F;a&gt;
macro, &lt;strong&gt;the regular s-expression or lispy regular expression&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; All we need is =s-matches-p=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;rx&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Creating a regexp that will match -&amp;gt; &amp;lt;File&amp;gt; [&amp;lt;Line&amp;gt;:&amp;lt;Column] &amp;lt;Suggestion&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq this&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;blog.org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx bol
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval this&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     space
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;one&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-or-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;more digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;one&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-or-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;more digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     space
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;zero&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-or-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;more anything&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     eol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;blog.org [17:16] Emacs Lisp, not emacs lisp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Produced regexp, I do not want to write or maintain this by hand
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;^blog\\.org[[:space:]]\\[\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[[:digit:]]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[[:digit:]]&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:space:]]\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:.\\|
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;$&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although it is less concise, the example above illustrates the selling
point of writing regular expressions at a higher level: &lt;strong&gt;it is more
understandable, comfortable to write and easier to maintain&lt;&#x2F;strong&gt;. Rather,
the &amp;quot;&lt;em&gt;lispyness&lt;&#x2F;em&gt;&amp;quot; of the expressions is more appropriate in the style
and heart of Emacs, working with symbolic expressions.&lt;&#x2F;p&gt;
&lt;p&gt;The builtin &lt;code&gt;rx&lt;&#x2F;code&gt; macro has no obvious manual but it has a symbol
documentation found via &lt;code&gt;describe-function&lt;&#x2F;code&gt;. For a powerful idea, it
doesn&#x27;t have strong examples in the wiki or web to promote it. Hackers
before users. To be fair, &lt;strong&gt;reading the documentation is enough but
examples or recipes would hasten comprehension&lt;&#x2F;strong&gt;. This is what this
article explores, thus the following sections are exploring some
syntax or construct. (Aside, the problems I use are found in &lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;Regular-Expressions-Cookbook-Jan-Goyvaerts&#x2F;dp&#x2F;0596520689&quot;&gt;Regular
Expression Cookbook&lt;&#x2F;a&gt; and if you found them intriguing, support the
author and buy the book.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;strings-and-quoting&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#strings-and-quoting&quot; aria-label=&quot;Anchor link for: strings-and-quoting&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Strings And Quoting&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;STRING
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     matches string STRING literally.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;CHAR
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     matches character CHAR literally.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval FORM&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     evaluate FORM and insert result.  If result is a string,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     ‘regexp-quote’ it.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;PROBLEM:&lt;&#x2F;strong&gt; What (regular) expression matches this string:
&lt;code&gt;The punctuation characters in the ASCII table are: !&amp;quot;#$%&amp;amp;&#x27;()*+,-.&#x2F;:;&amp;lt;=&amp;gt;?@[\]^_`{|}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Escape the double quote here
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq input &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;The punctuation characters in the ASCII table are: !&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#$%&amp;amp;&amp;#39;()*+,-.&#x2F;:;&amp;lt;=&amp;gt;?@[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;^_`{|}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;The punctuation characters in the ASCII table are: !&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#$%&amp;amp;&amp;#39;()*+,-.&#x2F;:;&amp;lt;=&amp;gt;?@[&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;^_`{|}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Direct use of strings
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p input input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Does not work because of quoting
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;regexp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quote input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; More rx
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This problem is merely quoting or escaping syntax characters, that is
if you know what those syntax characters are. The function
&lt;code&gt;regexp-quote&lt;&#x2F;code&gt;, which escapes those characters, is simple enough. This
is done by default by &lt;code&gt;rx&lt;&#x2F;code&gt; when a string is passed in for simplicity.
Finally, string variables can be used through the &lt;code&gt;eval&lt;&#x2F;code&gt; syntax, which
is like inserting values with backquoting.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;variables-and-ranges&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#variables-and-ranges&quot; aria-label=&quot;Anchor link for: variables-and-ranges&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Variables And Ranges&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any SET ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;in SET ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;char SET ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     matches any character in SET ....  SET may be a character or string.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     Ranges of characters can be specified as ‘A-Z’ in strings.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     Ranges may also be specified as conses like ‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?A . ?Z&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     SET may also be the name of a character class: ‘digit’,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     ‘control’, ‘hex-digit’, ‘blank’, ‘graph’, ‘print’, ‘alnum’,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     ‘alpha’, ‘ascii’, ‘nonascii’, ‘lower’, ‘punct’, ‘space’, ‘upper’,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     ‘word’, or one of their synonyms.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;PROBLEM:&lt;&#x2F;strong&gt; Create one regular expression to match all common
misspellings of calendar, so you can find this word in a document
without having to trust the author’s spelling ability. Allow an a or e
to be used in each of the vowel positions.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;nd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;celander&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq misspelling&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval misspelling&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval misspelling&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;nd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval misspelling&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;calendar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;c[ae]l[ae]nd[ae]r&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated pattern
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from demonstrating a simple range construct, the use of
sub-patterns through the familiar &lt;code&gt;eval&lt;&#x2F;code&gt; allows us to treat these
expressions more modularly, which helps us move away from a monolithic
concatenated string.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;PROBLEM:&lt;&#x2F;strong&gt; Create a regular expression to match a single
hexadecimal character.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a-f&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A-F&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0-9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a-f&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A-F&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0-9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Equivalently
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;[0-9A-Fa-f]&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;char hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; More rx
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Equivalently
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;[[:xdigit:]]&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated pattern
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lastly, the range syntax allows the familiar dashes to add character
range. Rather, the abstraction of special character ranges like
&lt;code&gt;[:upper:]&lt;&#x2F;code&gt; or &lt;code&gt;[:xdigit:]&lt;&#x2F;code&gt; is nice to know. Other useful constructs
such as &lt;code&gt;word-start&lt;&#x2F;code&gt;, &lt;code&gt;line-end&lt;&#x2F;code&gt;, and &lt;code&gt;punctuation&lt;&#x2F;code&gt; exist that is
worthy to be explored.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;alternatives-and-depth&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#alternatives-and-depth&quot; aria-label=&quot;Anchor link for: alternatives-and-depth&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Alternatives And Depth&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;| SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     matches anything that matches SEXP1 or SEXP2, etc.  If all
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     args are strings, use ‘regexp-opt’ to optimize the resulting
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     regular expression.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;zero&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-or-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;one SEXP ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;optional SEXP ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;opt SEXP ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     matches zero or one occurrences of A.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;: SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;seq SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     matches what SEXP1 matches, followed by what SEXP2 matches, etc.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; N SEXP&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; N SEXP ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     matches N occurrences.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;PROBLEM:&lt;&#x2F;strong&gt; Create a regular expression that when applied repeatedly to
the text &lt;code&gt;Mary, Jane, and Sue went to Mary&#x27;s house&lt;&#x2F;code&gt; will match &lt;code&gt;Mary&lt;&#x2F;code&gt;,
&lt;code&gt;Jane&lt;&#x2F;code&gt;, &lt;code&gt;Sue&lt;&#x2F;code&gt; and then &lt;code&gt;Mary&lt;&#x2F;code&gt; again.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;strings&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;all
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Mary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Jane&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Sue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Mary, Jane, and Sue went to Mary&amp;#39;s house&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Mary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) (&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Jane&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) (&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Sue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) (&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Mary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:Jane\\|Mary\\|Sue\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This simple problem is a demonstration of using the alternation
construct, which is related to ranges and classes. Nothing fancy but
the possibility of making it nuanced exist.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;PROBLEM:&lt;&#x2F;strong&gt; Create a regular expression matching 0 to 255.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq range&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expression &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Expression and pattern separated for reuse
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;optional digit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;optional digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;optional
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0-4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;optional digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;optional &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0-5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;6-9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;any &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;3-9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;optional digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq range&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx bol &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval range&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; eol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A test for the regular expression
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;cl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;every &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;number&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p range&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;number&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string number&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;number&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 255&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;0\\|1\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:[[:digit:]][[:digit:]]?\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?\\|2\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:digit:]]?\\|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;]?\\|[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:digit:]]?\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?\\|[3-9][[:digit:]]?&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; To use this IP Addresses
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq ip4&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx bol
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval range&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval range&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      eol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p range&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;30&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p ip4&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;300&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Testing for permutation might take too long, one is good enough
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p ip4&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;61.12.234.30&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:[[:digit:]][[:digit:]]?\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?\\|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:digit:]]?\\|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;]?\\|[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:digit:]]?\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?\\|[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:digit:]]?\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\.\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\{3\\}\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:[[:digit:]][[:digit:]]?\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?\\|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?:[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:digit:]]?\\|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;]?\\|[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:digit:]]?\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?\\|[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;][[:digit:]]?\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The idea of this expression is matching the first digit, then
considering the branches. Even if I don&#x27;t explain in depth, the syntax
should be helpful; but three new constructs deserve some words. First,
the &lt;code&gt;optional&lt;&#x2F;code&gt; or &lt;code&gt;opt&lt;&#x2F;code&gt; syntax is the equivalent of the zero-or-one
construct. Second, the &lt;code&gt;sequence&lt;&#x2F;code&gt; or &lt;code&gt;seq&lt;&#x2F;code&gt; syntax is primarily an
expression wrapper, where a list not an atom is required. Third,
&lt;code&gt;repeat&lt;&#x2F;code&gt; syntax is the same as the repetition construct of a prior
pattern. Regardless of the new syntax, the problem is just flexing the
syntax.&lt;&#x2F;p&gt;
&lt;p&gt;Also, remember to write tests for regular expressions. I
made three mistakes on my first draft, thus test before publishing.
Strangely, regular expressions are like functions that can be property
checked.&lt;&#x2F;p&gt;
&lt;p&gt;Before I forget, the &lt;code&gt;eval&lt;&#x2F;code&gt; construct requires that the variables
exist in the interpreter; meaning, they have to be globally set via
&lt;code&gt;setq&lt;&#x2F;code&gt; before being used. That is why two setters in the snippet set
up the expression and pattern separately and respectively. I suggest
setting the expression or pattern via &lt;code&gt;defconst&lt;&#x2F;code&gt; or &lt;code&gt;defvar&lt;&#x2F;code&gt; as
refactoring. It is unfortunate that &lt;code&gt;let&lt;&#x2F;code&gt; will not work with &lt;code&gt;eval&lt;&#x2F;code&gt; ,
but it isn&#x27;t a huge cost.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;groups-and-backreferencs&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#groups-and-backreferencs&quot; aria-label=&quot;Anchor link for: groups-and-backreferencs&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Groups And Backreferencs&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;submatch SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     like ‘and’, but makes the match accessible with ‘match-end’,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     ‘match-beginning’, and ‘match-string’.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;submatch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n N SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;‘&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n N SEXP1 SEXP2 ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;’
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     like ‘group’, but make it an explicitly-numbered group with
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     group number N.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;PROBLEM:&lt;&#x2F;strong&gt; Create a regular expression that matches any date in
yyyy-mm-dd format and separately captures the year, month, and day. As
extra challenge, make the groups named.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq date&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;strings&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;all date&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%F&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Output and pattern, notice it is day, month and year or reverse order
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:[[:digit:]]\\{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\}\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;-\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:[[:digit:]]\\{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\}\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;-\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:[[:digit:]]\\{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\}\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;2017-03-30&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;30&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;03&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;2017&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Capturing groups are fundamental; however, this is where the syntax
needs works. Named groups aren&#x27;t possible here, instead we are limited
to numbered groups. Closely, this is not a limitation of the macro but
the specific Emacs Lisp regex syntax; a more domain specific version
can be tuned. This example just shows not every feature is translated.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;group-n&lt;&#x2F;code&gt; or &lt;code&gt;group&lt;&#x2F;code&gt; syntax is obvious in intention. The first
argument represent the group number and the rest are the actual
expression. Nothing fancy.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;PROBLEM:&lt;&#x2F;strong&gt; Create a regular expression that matches &amp;quot;&lt;em&gt;magical&lt;&#x2F;em&gt;&amp;quot; dates
in yyyy-mm-dd format. A date is magical if the year minus the century,
the month, and the day of the month are all the same number. For
example, &lt;code&gt;2008-08-08&lt;&#x2F;code&gt; is a magical date.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq magical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rx
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;group&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; digit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backref &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backref &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matches&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p magical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;2008-08-08&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generated pattern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;[[:digit:]]\\{2\\}\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:[[:digit:]]\\{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;\\}\\&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;-\\1-\\1&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This just shows backreferences are available. The &lt;code&gt;backref&lt;&#x2F;code&gt; syntax is
just invoking the group with the numeric argument. Again, nothing
complicated.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;re-builder&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#re-builder&quot; aria-label=&quot;Anchor link for: re-builder&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
re-builder&lt;&#x2F;h2&gt;
&lt;p&gt;To conclude this exploration, a UI exist for testing and experimenting
on regular expressions: &lt;code&gt;re-builder&lt;&#x2F;code&gt;. Execute the command,
&lt;code&gt;re-builder&lt;&#x2F;code&gt; or &lt;code&gt;regexp-builder&lt;&#x2F;code&gt;, on a buffer containing the text,
then execute &lt;code&gt;reb-change-syntax&lt;&#x2F;code&gt; and select &lt;code&gt;rx&lt;&#x2F;code&gt;. The following
screencast can be illuminating.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;exploring-emacs-rx-macro&#x2F;screencast.gif&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;This UI can handle raw expression but we are interested in how this
ties to &lt;code&gt;rx&lt;&#x2F;code&gt;. To elaborate, every time the expression is updated, it
highlights any possible matches. Although it is not as dynamic or
programmatic, it is handy as a quick experiment and check.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;This macro is not a replacement for learning regular expressions since
there are nuances that a DSL can cover such language specific syntax
like &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Perl%5FCompatible%5FRegular%5FExpressions&quot;&gt;PCRE&lt;&#x2F;a&gt;; rather, productivity is the key. As for me, I do not want
to write raw regular expression, I would prefer an abstraction to make
it easier on the eyes and hands.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, I did not discuss all constructs but only the interesting
features that draw me in, and perhaps enchant you as well. &lt;strong&gt;Read The
Function Documentation&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;If this can be done for regular expressions, can it be applied for
SQL? An idea still waiting to be written.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Now and Then, Here and There - Analysis</title>
          <pubDate>Mon, 13 Mar 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/watcher/now-and-then-here-and-there-analysis/</link>
          <guid>https://fnlog.dev/watcher/now-and-then-here-and-there-analysis/</guid>
          <description>&lt;h2 id=&quot;now-and-then-here-and-there&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#now-and-then-here-and-there&quot; aria-label=&quot;Anchor link for: now-and-then-here-and-there&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Now and Then, Here and There&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Now%5Fand%5FThen%252C%5FHere%5Fand%5FThere&quot;&gt;Now and Then, Here and There (2000)&lt;&#x2F;a&gt; is a fascinating anime. Plainly, it
is about a kid who is sucked to another world by helping a mysterious
girl and wants to return home. Going to the other world, he must save
her and possibly overthrow the hegemony of a mad dictator. It seems
similar to &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Alice%2527s%5FAdventures%5Fin%5FWonderland&quot;&gt;Alice in Wonderland&lt;&#x2F;a&gt; but far from its childish playfulness.
I like this anime not for its dark themes but how it presents its
story. It is gripping and hypnotizing all throughout without being
dramatic or superfluous although this is not for the faint of heart or
the casual.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;tower-of-courage.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;What inspired me to write an article is its ending. After watching, I
felt stunned and lost. This analysis is a way for me to cope and
understand and what it all meant. That itself is saying much about my
experience and its quality.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;SPOILERS AHEAD&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-end&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-end&quot; aria-label=&quot;Anchor link for: the-end&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The End&lt;&#x2F;h2&gt;
&lt;p&gt;We start at the end: the ending. As the usual story goes, our
protagonist, Shu, returns home and the castle in the sky destroyed. In
that respect, the ending should be a joyous occasion. Sadly, Lala
vanishing makes the adventure fruitless from a hero&#x27;s perspective.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;the-sunset.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;This is compounded by Sara staying in the other world. Initially, she
has the strongest desire to go back; by choosing to give life, she
hopes that all her suffering will bear fruit someday.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;sara-reason.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;When all said is done, Shu is back to where he came from. Nothing is
brought or returned as if everything was a dark dream.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;going-back.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;With the final lingering shot, &lt;strong&gt;how can we interpret this ending?&lt;&#x2F;strong&gt; In
comparison, &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FWizard%5Fof%5FOz%5F(1939%5Ffilm)&quot;&gt;The Wizard of Oz (1939)&lt;&#x2F;a&gt; resolves issues within the dream
while &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FChronicles%5Fof%5FNarnia&quot;&gt;The Chronicles of Narnia series&lt;&#x2F;a&gt; carries lessons over. Here, our
protagonist has no issue aside from being a rash and impulsive boy. In
the end, he still is a rash and impulsive boy although slightly
improved.&lt;&#x2F;p&gt;
&lt;p&gt;This ending can be a case for the futility of war. What did all the
fighting accomplish? Nothing but the loss of Nabuca, Sis, Boo and
countless other lives. It can be also the value of life since Shu
persuades people to live and Sara keeping the baby despite strong
reasons to the contrary. Many interpretations exist but how do we go
about it? To begin our analysis, I want to focus on an element of the
story: &lt;strong&gt;character development&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;character-development&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#character-development&quot; aria-label=&quot;Anchor link for: character-development&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Character Development&lt;&#x2F;h2&gt;
&lt;p&gt;A character with much development is Sara; despite being the
protagonist, Shu does not change or develop. Another way to put it is
that the other world has changed Sara while it left Shu unchanged.
This idea can be explored with Nabuca and Tabool.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;nabuca-vs-tabool.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Both of them came from the same village yet are changed differently.
In power, Nabuca is clearly stronger and controlled than Tabool; in
status, Nabuca is a faithful soldier while Tabool is a political
animal. As with Shu and Sara, both wanted to go home yet decide
differently. Near the end, Nabuca wants to stop killing while Tabool
wants to continue and eventually take over Hamdo&#x27;s empire. That
difference culminates in Tabool betraying Nabuca.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;tabool-betrayal.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Regardless, both of them die and consequently neither of them go back
to their village; however, Nabuca has a more meaningful story death
than Tabool whose death last less than a second of screen time.
Another way of looking at it is that since both were changed by the
war, the story does not allow them to return home.&lt;&#x2F;p&gt;
&lt;p&gt;Thinking about our main pair, Shu returns home with his morals while
Sara does not who was broken by captivity. When their values were
tested, Shu does not kill Nabuca while Sara kills her rapist.
Therefore, &lt;strong&gt;is this story talking about maintaining humanity?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;humanity-and-backstory&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#humanity-and-backstory&quot; aria-label=&quot;Anchor link for: humanity-and-backstory&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Humanity and Backstory&lt;&#x2F;h2&gt;
&lt;p&gt;How does war change people? Rather, &lt;strong&gt;how does war break people?&lt;&#x2F;strong&gt; Shu
could have been broken several times in the story but remains rooted.
Despite having little development, he is the only character that keeps
his values, a fixed point.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;the-wooden-soldier.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;What is humanity or integrity? A complex question for anyone to
answer. Here, I mean it as a quality of keeping character and belief
but that itself is a vague answer. Instead, I want to point out
another element in the story that relates to it: &lt;strong&gt;backstory or the
lack of it&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Given thirteen episodes, what do we know about our characters? Nothing
substantial. I do not know who Shu, Lala, Nabuca or anyone else. Why
is Hamdo crazy? Was he a good person before he went crazy for Lala?
Why is Abelia faithful to Hamdo? Were Nabuca and Tabool good kids
before? How old is Lala? Why is Shu naive to a fault? I can go on but
the backstory is definitely lacking or missing.&lt;&#x2F;p&gt;
&lt;p&gt;Commonly, a backstory is used to empathize and understand a
character&#x27;s motivation and actions. The key word is empathy. By
empathizing on characters, it changes your perception or judgment on
their action and consequences.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;hamdo-death.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Consider Hamdo&#x27;s death. In the story, Hamdo is presented as a weak and
paranoid dictator. His death might be fair judgment on his actions.
Imagine, if Lala made Hamdo crazy or was the reason? What if Hamdo was
a great and benevolent dictator, broken by time and circumstance? If
the backstory existed, would it change your personal judgment?
Concrete examples are &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Code%5FGeass&quot;&gt;Lelouch from Code Geass&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Puella%5FMagi%5FMadoka%5FMagica&quot;&gt;Homura from Puella
Magi Madoka Magica&lt;&#x2F;a&gt; if my example is lacking.&lt;&#x2F;p&gt;
&lt;p&gt;By ignoring the backstory, the characters can only be judged within
the context of the story. &lt;strong&gt;It is their current actions that will define
them&lt;&#x2F;strong&gt;, not by how justifiable and tragic their past stories are. This
idea is exemplified in the child soldiers. Aside from Shu, Nabuca and
Tabool, Boo is the other soldier who appears neutral, not unchanged,
by the situation. We cannot say if his hands are dirty without past
information, but within the story he is good, further amplified when he
takes a bullet for Nabuca. A backstory exists within the story but not
enough to completely paint them.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;boo-death.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The lack of backstory is asking us to make a fair judgment, but what
are we to judge? Humanity? Our characters are forced into this
situation, we should not care who they were, but who they are now. We
are to judge the effect of war on their character.&lt;&#x2F;p&gt;
&lt;p&gt;In the first place, why should people stay true in dire times
specially for children placed in the horrors of war? Even without the
backstory, we can empathize how broken they are by their situation. To
dig deeper, we explore the mysterious character of Lala Ru.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lala-ru&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#lala-ru&quot; aria-label=&quot;Anchor link for: lala-ru&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Lala Ru&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Because ten billion years&#x27; time is so fragile, so ephermal...&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;
&lt;em&gt;&lt;strong&gt;it arouses such a bittersweet, almost heartbreaking fondness&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Lala, the main heroine, is passive, not incapable. She has the power
of water although at the cost of using her life force. Why does she
allow people to use or abuse her?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;lala-abuse.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;With her powers, Lala shares to Shu that she had been kind but has
been neglected and hunted. She believed she was doing good but it
brought more danger and chaos, thus she does not waste it for
humanity. This somewhat explains why she shows passivity or disdain
instead of force or power when threatened. If she tried to resist, she
would use her life force; after many times, silence seems to be louder.&lt;&#x2F;p&gt;
&lt;p&gt;Going back, Shu responds that her power is ultimately for good and
good people still exist, such as himself and motherly Sis. What this
tells us that Lala has lost hope as with Sara. Based on the previous
ideas, Lala is not allowed to return home by the story. Strange
enough, where is her home? Where will she return to?&lt;&#x2F;p&gt;
&lt;p&gt;If Lala&#x27;s power is water and it depends on her life force, is Lala the
sea that fills the barren wasteland with life? Should Lala return to
the earth or ether?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;the-rainbow.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;This is speculation why Lala disappears in the end that conveniently
ties into the ideas presented. The question still remains to where
Lala should return. If she lives, does she go with Shu, stay with Sara
or something else entirely? Lala is mysterious and ethereal enough
that believing she is a magical being is not far off. The opening
remark can be a hint.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;opening-remark.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Based on this, the other world might be set in a post-apocalyptic
future, not necessarily the same timeline as the original world. This
might roughly indicate Lala&#x27;s age that implies her home is somewhat
timeless. What is fascinating about ten billion years is that the sun
may roughly die at the time. It implies not just the sun, but humanity
and life itself.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;sunset-reminder.png&quot; alt=&quot;&quot; &#x2F;&gt; &amp;amp;nbsp&lt;&#x2F;p&gt;
&lt;p&gt;This somewhat explains her fascination with sunsets, not sunrises. If
I were her that lost hope, I want to wait for the sun to close my eyes
and make my bed. If Lala is practically immortal, a dying light is a
consoling and understanding friend. In comparison, she may not be like
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Code%5FGeass&quot;&gt;C.C. from Code Geass&lt;&#x2F;a&gt;, but both share the isolation and burden of their
powers.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly, connecting the opening remarks with Lala is flimsy since no
text supports it but it does set a tone for which we can read from. It
would have helped connect the dots if someone described the world even
for just a minute. What we do now that Lala has lived for thousands of
years and much of our reasoning somewhat holds.&lt;&#x2F;p&gt;
&lt;p&gt;Without a defined home, she breaks the idea or need to return home,
thus she is the exception. Instead, notice her final act is of
sacrifice. By using her power to sink the flying fortress knowing the
drawback and reason, she shows her restored faith and hope in
humanity. Phrased differently, &lt;strong&gt;Lala was looking for hope.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Urged by both the goodness of Shu and Sis, Lala shows both hope and
action. It is strange that Lala has not met good people for her to
have this problem but this is a backstory in itself. What is the story
asking by making the protagonist save her? This leads us to explore
what hope is in exploring the message.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hope-and-optimism&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#hope-and-optimism&quot; aria-label=&quot;Anchor link for: hope-and-optimism&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Hope and Optimism&lt;&#x2F;h2&gt;
&lt;p&gt;Another hard question, &lt;strong&gt;what is hope?&lt;&#x2F;strong&gt; Like with humanity, I can only
mean it here as quality of optimism or expectation for good things to
come. Instead, how does the series use the theme of hope or optimism?
Easily, Shu is the story&#x27;s hope.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;hope.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Consider Nabuca and Tabool, Nabuca is doing all the atrocities
required of him so that he can go back home; however, Tabool has
abandoned the false hope and embraced the belief of being the
dictator. When Nabuca discovers that their village was scorched after
being taken, he puts his misplaced hope in Shu returning in his stead.
Nabuca&#x27;s change comes from Shu unwavering humanity and disruption of
their ranks and becomes his hope in the end.&lt;&#x2F;p&gt;
&lt;p&gt;Consider Sara, she poses the most direct challenge to Shu. She was
taken, raped and soiled, how can she have hope in living in suffering?
This is in contrast with the child soldiers who creates suffering
instead of receiving. When Sara attempts to kill herself and by
extension her unborn child, it a powerful question to Shu&#x27;s philosophy
of optimism and hope.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;sara-challenge.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The hard thing to see here is that a child represents the hope of its
parents. Both Shu and Sis convince Sara to keep the child that
represents hope, not a burden or a taint. This answer affirms Shu and
the story.&lt;&#x2F;p&gt;
&lt;p&gt;Consider Abelia, the scene where he lets Hamdo die is her loss of hope
or faith in him. Why has she been faithful to him all this time, we
may never know. Looking closely, it is Abelia that gives Shu a chance
to survive by not killing him. She is averse to killing yet has to out
of orders. In the end, what is left for her but to find a new hope to
carry on.&lt;&#x2F;p&gt;
&lt;p&gt;Going back to Lala, she has lived for thousands of years and has lost
hope in humanity. Applying Shu&#x27;s optimism to Lala&#x27;s plight, Shu&#x27;s
arrival is the hope or goodness her immortal life is anticipating. The
final conversation of Shu with Sara affirms this message of hope.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;SHU: Sara, you know, you once said I lied to you?
&lt;&#x2F;span&gt;&lt;span&gt;     Remember that?
&lt;&#x2F;span&gt;&lt;span&gt;     I still believe I was right.
&lt;&#x2F;span&gt;&lt;span&gt;     No matter where you are, whatever adversities you face,
&lt;&#x2F;span&gt;&lt;span&gt;     as long as you&amp;#39;ve got your life, something good is bound to happen.
&lt;&#x2F;span&gt;&lt;span&gt;     Something so totally awesome that would make up for all the bad stuff.
&lt;&#x2F;span&gt;&lt;span&gt;     Sure, it can get pretty tough in the meantime.
&lt;&#x2F;span&gt;&lt;span&gt;     I don&amp;#39;t quite know hot to put it but... you know... um...
&lt;&#x2F;span&gt;&lt;span&gt;     Well, there you have it!
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In a way, Lala&#x27;s disappearance makes sense when Shu&#x27;s unwavering
humanity is put forward. Like with Nabuca, she is granted a meaningful
yet bittersweet death by completing her character arc.&lt;&#x2F;p&gt;
&lt;p&gt;A subtle inference with this idea is that if Lala cannot be judged by
changes in war, then was she the cause? Rather, is she the judge that
deserves an answer to the chaos of her existence? In a way, she is the
beginning and the end of the story and of the world. This is
speculation but an interesting guess that reminds of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Ky%25C5%258Ds%25C5%258Dgiga&quot;&gt;Lady Koto in
Kyousougiga&lt;&#x2F;a&gt; who causes the story by her love and existence.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;returning-home&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#returning-home&quot; aria-label=&quot;Anchor link for: returning-home&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Returning Home&lt;&#x2F;h2&gt;
&lt;p&gt;Going back to the ending, we return to the original world with the
original question: what did change? Rather, &lt;strong&gt;should anything change?&lt;&#x2F;strong&gt;
Shu coming back from war without changing is clever. Soldiers
returning from war can develop &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Posttraumatic%5Fstress%5Fdisorder&quot;&gt;posttraumatic stress disorder (PTSD)&lt;&#x2F;a&gt; by
the experiences and hardships of war. Many films and games have
discussed this in greater detail such as &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Rambo%5F%2528film%5Fseries%2529&quot;&gt;First Blood from Rambo series&lt;&#x2F;a&gt;
and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Spec%5FOps%253A%5FThe%5FLine&quot;&gt;Spec Ops: The Line&lt;&#x2F;a&gt; that I might not be fit to address. Regardless,
our protagonist does not develop this crippling disorder by virtue of
his unwavering humanity.&lt;&#x2F;p&gt;
&lt;p&gt;In the context of the disorder, it is good that Shu remained himself
despite his challenges. This ending cleverly undermines character
development in the context of tragedy or hardships. Simply, to not
change is better than to change for the worse. This is not a
prescription or cure of the disorder but a message to never lose
oneself. It is sad that nothing is gained but nothing was lost
that also ties in the theme of futility of war.&lt;&#x2F;p&gt;
&lt;p&gt;By virtue of Shu returning home, &lt;strong&gt;the ending and story is telling us
to remain hopeful or true despite the lack of it.&lt;&#x2F;strong&gt; You could claim
the final discussion was the message but we needed to understand why
this hopeful message was shadowed by a return to zero and what it
meant. For Nabuca or Sara, the return is not zero. As the viewer, are
we still here and there?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;At last, I am at peace with this anime. I do admit that the backstory,
world building, character development, animation and portrayal of dark
themes might be lacking; however, the somber and sublime story it
tells towers over its faults. At the end, I felt I wanted to watch a
sunset with Lala Ru someday. Not of affection but of solace.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;now-and-then-here-and-there-analysis&#x2F;the-last-sunset.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;A true favorite anime I can watch now and then.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Literate Org-Haskell</title>
          <pubDate>Wed, 22 Feb 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/literate-org-haskell/</link>
          <guid>https://fnlog.dev/dev/literate-org-haskell/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ve been studying &lt;a href=&quot;https:&#x2F;&#x2F;www.haskell.org&#x2F;&quot;&gt;Haskell&lt;&#x2F;a&gt; and loving it. In order to facilitate my
learning, I wanted to explore it using &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Literate%5Fprogramming&quot;&gt;literate programming&lt;&#x2F;a&gt; via
&lt;a href=&quot;http:&#x2F;&#x2F;orgmode.org&#x2F;worg&#x2F;org-contrib&#x2F;babel&#x2F;intro.html&quot;&gt;org-babel&lt;&#x2F;a&gt;. Aside from the usual setup of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;haskell&#x2F;haskell-mode&quot;&gt;haskell-mode&lt;&#x2F;a&gt; and its
associates, I was eager to write the following block.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;org&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-org &quot;&gt;&lt;code class=&quot;language-org&quot; data-lang=&quot;org&quot;&gt;&lt;span&gt;#+BEGIN_SRC haskell
&lt;&#x2F;span&gt;&lt;span&gt;myHead :: [x] -&amp;gt; Maybe x
&lt;&#x2F;span&gt;&lt;span&gt;#+END_SRC
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once I went to the coding, there is one significant problem I
encountered: &lt;strong&gt;my haskell tooling doesn&#x27;t work when it has no backing
file.&lt;&#x2F;strong&gt; Emacs buffers represent just a file or nothing, such is the
case with &lt;code&gt;org-src&lt;&#x2F;code&gt; buffers. Much of the tooling comes from &lt;code&gt;ghc-mod&lt;&#x2F;code&gt;,
&lt;code&gt;intero&lt;&#x2F;code&gt;, &lt;code&gt;stack&lt;&#x2F;code&gt; and what not but all of them depend on a real file
and when a buffer doesn&#x27;t have a file, it doesn&#x27;t work. The obvious
solution is to simply make the virtual file into a real one.&lt;&#x2F;p&gt;
&lt;p&gt;As obvious the solution is, the true error with haskell is that it
does not recognize files without a &lt;code&gt;.hs&lt;&#x2F;code&gt; extension as such you cannot
just load a haskell source file without it having the correct
extension which is weird. So it is not enough to realize the file but
to add the proper extension as well. Here is the &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;05c7d2f95c0f343d0954694b6c5a0635&quot;&gt;snippet&lt;&#x2F;a&gt; for the impatient.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defconst fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;extension &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.hs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;The de facto haskell file extension.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;extension &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Add the extension of .hs to a file or buffer NAME.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ends&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-with&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;extension&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat name fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;extension&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Hook when buffer is haskellized.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskellize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;optional buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Renames an BUFFER with a .hs extension if it doesn&amp;#39;t have one.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;exists&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Buffer &amp;#39;%s&amp;#39; has no backing file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;extension name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;extension file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;cond
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A buffer named &amp;#39;%s&amp;#39; already exists&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-equal name haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Buffer %s is already haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rename-file file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rename&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;visited&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;modified&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Buffer %s is now haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;optional buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Check if BUFFER is an org-haskell buffer.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; major&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode &amp;#39;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fboundp &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;edit&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;edit&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskellize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;rest _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Haskellize org haskell buffer.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskellize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hooks &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;rest _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Save haskell buffer along with the edit buffer.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cleanup&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;orig&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fun &amp;amp;rest args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Cleanup the org-haskell buffer when exiting the edit buffer.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply orig&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fun args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;exists&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;delete-file org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;haskellize-org-haskell-buffer t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;advice&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;edit&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save :before &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;save-org-haskell-buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;advice&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;edit&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;exit :around &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;cleanup-org-haskell-buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Quite a mouthful for such a simple intent and this might apply to
other babel buffers. I want to explore the nuance of being literate
in &lt;span class=&quot;underline&quot;&gt;org-mode&lt;&#x2F;span&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;buffers&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#buffers&quot; aria-label=&quot;Anchor link for: buffers&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Buffers&lt;&#x2F;h2&gt;
&lt;p&gt;In Emacs, you usually create a buffer associated with a file via
&lt;code&gt;find-file&lt;&#x2F;code&gt;. There are times when all you need is a temporary
scratchpad and you do not want the cost of managing the file system,
such is the purpose of &lt;code&gt;switch-buffer&lt;&#x2F;code&gt; and &lt;code&gt;*scratch*&lt;&#x2F;code&gt; buffer. If I
didn&#x27;t use the literate style, the book I am reading would create a
clutter and would I remember all the files after I finish with the
book? Literate programming allows me to keep one file and export it
via &lt;code&gt;org-tangle&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The way &lt;code&gt;org-babel&lt;&#x2F;code&gt; does it by creating special buffers that rebind
the &lt;code&gt;save-buffer&lt;&#x2F;code&gt; command to &lt;code&gt;org-edit-src-save&lt;&#x2F;code&gt; which updates the
original block region thereby creating no extra files while editing
inside blocks. The case is also true for several libraries such as
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;magit&#x2F;magit&quot;&gt;magit&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emacs-helm&#x2F;helm&quot;&gt;helm&lt;&#x2F;a&gt;. Thankfully, Emacs allows us to realize buffers by
simply using &lt;code&gt;save-buffer&lt;&#x2F;code&gt; and it creates a backing file for it.&lt;&#x2F;p&gt;
&lt;p&gt;However, we are left now with managing the realized file as well as
changing the file extension of it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;babel-blocks&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#babel-blocks&quot; aria-label=&quot;Anchor link for: babel-blocks&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Babel Blocks&lt;&#x2F;h2&gt;
&lt;p&gt;From the problems above, what we want is:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;When opening the block buffer, create a realized file with the
correct extension.&lt;&#x2F;li&gt;
&lt;li&gt;When using the remapped &lt;code&gt;org-edit-src-save&lt;&#x2F;code&gt;, also save the backing
file as with the original &lt;code&gt;save-buffer&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;When closing the block buffer, delete the realized file&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The first thing anyone wants to look for when making an extension are
hooks. Sadly, the hooks that are relevant to our goal is only
&lt;code&gt;org-src-mode-hook&lt;&#x2F;code&gt;. You can also add &lt;code&gt;kill-buffer-hook&lt;&#x2F;code&gt; but it might
be out of its scope. Since we have no hooks, we have to resort to the
devious extensible &lt;code&gt;advice-add&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;After fiddling around with &lt;code&gt;describe-function&lt;&#x2F;code&gt;, the exit command we
are interested in is &lt;code&gt;org-edit-src-exit&lt;&#x2F;code&gt; and the entry command is the
&lt;code&gt;org-src-mode-hook&lt;&#x2F;code&gt;. We include &lt;code&gt;org-edit-src-save&lt;&#x2F;code&gt; to complete the
CRUD life cycle.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;renaming-files&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#renaming-files&quot; aria-label=&quot;Anchor link for: renaming-files&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Renaming Files&lt;&#x2F;h2&gt;
&lt;p&gt;The approach is hooking to &lt;code&gt;org-src-mode-hook&lt;&#x2F;code&gt; to call &lt;code&gt;save-buffer&lt;&#x2F;code&gt;
at the same time changing the file to add the extension. This is what
&lt;code&gt;fn&#x2F;haskellize-buffer-file&lt;&#x2F;code&gt; does which I want to give some focus on.
Once we realize the file, there is still the buffer and file
separation: if you rename the file, does it rename the buffer or
vice-versa?&lt;&#x2F;p&gt;
&lt;p&gt;If you rename the buffer, it does not change the file associated with;
what is changed is &lt;code&gt;buffer-name&lt;&#x2F;code&gt; via the &lt;code&gt;rename-buffer&lt;&#x2F;code&gt; function. If
you rename the file through &lt;code&gt;rename-file&lt;&#x2F;code&gt;, Emacs only see the old file
missing does creates another one if saved; what needs to be changed
rather is the file association which is done through the function
&lt;code&gt;set-visited-file-name&lt;&#x2F;code&gt;. Emphasizing these lines are:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rename-file file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rename&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;visited&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name haskellized&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from the usual file handling, his is the only nuance with the
separation when changing file or buffer names. Now we created realized
and renamed the buffer. Updating and deleting it is as simple calling
&lt;code&gt;save-buffer&lt;&#x2F;code&gt; after &lt;code&gt;org-edit-src-save&lt;&#x2F;code&gt; and removing it with
&lt;code&gt;delete-file&lt;&#x2F;code&gt; after &lt;code&gt;org-edit-src-exit&lt;&#x2F;code&gt;. Easy enough, but we have a
problem if we advice it head-on.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;local-advice&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#local-advice&quot; aria-label=&quot;Anchor link for: local-advice&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Local Advice&lt;&#x2F;h2&gt;
&lt;p&gt;Since our code depends on a specific mode but advicing does not, if
you add the advice and modify some other code block, it will create
the file unintentionally. Our code needs to run on a specific major
mode, namely &lt;code&gt;haskell-mode&lt;&#x2F;code&gt;. Wouldn&#x27;t it be nice to have buffer local
advices like with variables? Since we don&#x27;t, we add safety by checking
for the major mode.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; major&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode &amp;#39;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And to be sure the current buffer is a babel buffer, we have
&lt;code&gt;org-src-edit-buffer-p&lt;&#x2F;code&gt; which checks if the buffer is intended for
literacy.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;edit&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Combining the two is enough safety. With that, it is enough to get
through our intent.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;custom-hook&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#custom-hook&quot; aria-label=&quot;Anchor link for: custom-hook&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Custom Hook&lt;&#x2F;h2&gt;
&lt;p&gt;A feature you can add lastly is a custom hook, which is just a list of
functions and not some ethereal object such as a kill ring, when the
buffer is haskell-ized. Remember how to declare it still reminds me
how I need to write more lisp:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Hook when buffer is haskellized.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :type &amp;#39;hook&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It is just a normal variable but with the type &lt;code&gt;&#x27;hook&lt;&#x2F;code&gt;, not obvious.
What can we do with this new hook, here is what I&#x27;ve done:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-or-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reload &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Invoke reload process without switching buffers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;window&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;excursion
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-or-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reload&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reload&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Reload interactive haskell process on save.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;after&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-or-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reload &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hindent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;before&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Reformat before saving.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;before&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;hindent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reformat&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-or-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reload&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reload&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;haskell&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hindent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;before&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What I is to automatically feed the haskell code into the REPL and
update it once I saved it and some linting won&#x27;t hurt as well. The
thing is I can&#x27;t run any of these unless the buffer has an associated
haskell file with it. You can think of others.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;As usual, this isn&#x27;t enough to cover all cases but it does it good
enough. There is one other issue I haven&#x27;t fully resolved which is the
tangling. The book exercises sometimes puts the code into a per
chapter folder which after updating the code must be tangled, the real
issue is how &lt;code&gt;ox-haskell&lt;&#x2F;code&gt; or &lt;code&gt;ob-haskell&lt;&#x2F;code&gt; has not respected the block
headers to do advanced tangling. More things to hack I guess.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Project Script Loader</title>
          <pubDate>Wed, 15 Feb 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/project-script-loader/</link>
          <guid>https://fnlog.dev/dev/project-script-loader/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;An early Emacs hack and study is creating a project script loader that
when I open a project such as Java or NodeJS, I want to load a custom
script specific to that project. Since I am using &lt;code&gt;projectile&lt;&#x2F;code&gt;, it was
a great learning experience on understanding symbols and lambdas.&lt;&#x2F;p&gt;
&lt;p&gt;The Emacs way of loading project specific configuration is through
=&lt;a href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&#x2F;manual&#x2F;html%5Fnode&#x2F;emacs&#x2F;Directory-Variables.html&quot;&gt;.dir-locals.el=&lt;&#x2F;a&gt; that has an unfortunately elaborate structure to fill
out. Emacs is a Lisp interpreter, thus this mechanism enforces safety
even in evaluating malicious code since it is possible in a multi-user
setup that someone tamper any automatic &lt;code&gt;eval&lt;&#x2F;code&gt; mechanism to cause
harm. Remember the saying, &lt;a href=&quot;https:&#x2F;&#x2F;duckduckgo.com&#x2F;l&#x2F;?kh=-1&amp;amp;uddg=https%253A%252F%252Fblogs.msdn.microsoft.com%252Fericlippert%252F2003%252F11%252F01%252Feval%252Dis%252Devil%252Dpart%252Done%252F&quot;&gt;eval is evil&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A stronger and direct reason you want to use such mechanism is to
avoid tangling your global configuration with a project specific
configuration. Keep the business and pure logic separate goes the
mantra. My use is with this blog, when I want to write I want to load
the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;org-jekyll-blogger.el&quot;&gt;org-jekyll-blogger.el&lt;&#x2F;a&gt; setup but not tangle the environment if I&#x27;m
not.&lt;&#x2F;p&gt;
&lt;p&gt;Although it is the builtin and preferred mechanism, it is slightly
frustrating to debug if your script is being run or that the variables
are set. Not to mention it is harder to edit. Sometimes you just want
to write the code and not worry about security, trust is overrated.&lt;&#x2F;p&gt;
&lt;p&gt;Since the project library &lt;code&gt;projectile&lt;&#x2F;code&gt; does not offer this simple yet
security riddled functionality, it leaves the ecosystem to fill in
that blank. Packages offering this mechanism already exist such as
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kotfic&#x2F;defproject&quot;&gt;defproject&lt;&#x2F;a&gt; but it is simple to write the code without relying on a
third-party package.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;project-script-loader&#x2F;screencast.gif&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;For the impatient, here is the complete &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;65d639fb8e7cac30c99f058d7586aabd&quot;&gt;snippet&lt;&#x2F;a&gt;; for the curious,
let&#x27;s discuss aspects of it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-library&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#project-library&quot; aria-label=&quot;Anchor link for: project-library&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Project Library&lt;&#x2F;h2&gt;
&lt;p&gt;I am using &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bbatsov&#x2F;projectile&quot;&gt;projectile&lt;&#x2F;a&gt; as project managing library. For this task, we
need two functions from it:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;projectile-project-p&lt;&#x2F;code&gt;
: This tells us if the current buffer is in a project.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;projectile-project-root&lt;&#x2F;code&gt;
: This gives us the current project root the current buffer is in.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;projectile-project-name&lt;&#x2F;code&gt;
: The optional third function, this prettifies the file path into a
more debuggable name.&lt;&#x2F;p&gt;
&lt;p&gt;If you aren&#x27;t using &lt;code&gt;projectile&lt;&#x2F;code&gt;, Emacs has a builtin project library
&lt;code&gt;vc&lt;&#x2F;code&gt; that is tied closely to a VCS. An example of checking if the
buffer is in a project.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;vcs-project-root &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;vc&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;vc&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;svn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;vc&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hg&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is rather primitive but it works if the project is under a
version control with &lt;code&gt;git&lt;&#x2F;code&gt;, &lt;code&gt;svn&lt;&#x2F;code&gt; or &lt;code&gt;hg&lt;&#x2F;code&gt;. Thankfully, this assumption
was not taken by &lt;code&gt;projectile&lt;&#x2F;code&gt; and it finds the root by looking for key
files that signify a project such as &lt;code&gt;.git&lt;&#x2F;code&gt;, &lt;code&gt;pom.xml&lt;&#x2F;code&gt; or others. The
builtin &lt;code&gt;vc&lt;&#x2F;code&gt; does not cut it; rather, a builtin function that finds
the project root is &lt;code&gt;locate-dominating-file&lt;&#x2F;code&gt;. This function takes a
file path and file name and recursively travels the parent to find the
file name starting at file path. If we assume a project is in a
directory that contains a &lt;code&gt;.project.el&lt;&#x2F;code&gt; file, here is the snippet for
this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;locate-project-root &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;locate&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dominating&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.project.el&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;projectile&lt;&#x2F;code&gt; also has their own copy of this function to avoid
depending on &lt;code&gt;files.el&lt;&#x2F;code&gt; where the original comes from. If you have
multiple key files aside from &lt;code&gt;.project.el&lt;&#x2F;code&gt;, it is better to create a
more performant version of this since you do not want to traverse the
disk several times.&lt;&#x2F;p&gt;
&lt;p&gt;The lesson in this is that this job is better left to a library.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;core&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#core&quot; aria-label=&quot;Anchor link for: core&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Core&lt;&#x2F;h2&gt;
&lt;p&gt;With this, we implement it quite easily:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Loads the `fn&#x2F;project-file&amp;#39; for a project.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;This is run once after the project is loaded signifying project setup.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Check if buffer is in a project
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expand&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.project.el&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;exists&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Check if project script exists
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Loading project init file for %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Some extra logging
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;condition&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-case&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ex &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Load it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;error &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Report the error
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;There was an error loading %s: %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string ex&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;load-project-file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;During my early writing, there was a bug that loading the project file
would trigger the &lt;code&gt;find-file-hook&lt;&#x2F;code&gt; endlessly. Thankfully, such subtle
issue had existed but either way it is simple to write.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;symbols-or-lambdas&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#symbols-or-lambdas&quot; aria-label=&quot;Anchor link for: symbols-or-lambdas&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Symbols Or Lambdas&lt;&#x2F;h2&gt;
&lt;p&gt;This quick implementation triggers the project configuration each time
a file in the project is opened. What we want is each main project
script be loaded once, not every time. This is true for the project
locals but not for the main project script.&lt;&#x2F;p&gt;
&lt;p&gt;Thinking functionally, this is &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Memoization&quot;&gt;memoization&lt;&#x2F;a&gt; of the main loader. We shiv
a quick memoization function:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memoize &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn fn&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cache&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;make-hash-table :test &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;equal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;rest args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Assuming `args&amp;#39; can be used with the hash function `equal&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cached&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gethash args cache&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; cached&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            cached&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;computed&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply fn args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;puthash args computed&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value cache&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            computed&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fib &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase n
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fib &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fib &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memoized &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memoize &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall fib&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memoized n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3 5 15 30 3 30&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Not the best implementation but notice we had to use &lt;code&gt;let&lt;&#x2F;code&gt;, &lt;code&gt;funcall&lt;&#x2F;code&gt;
and &lt;code&gt;apply&lt;&#x2F;code&gt; to use it instead just the usual function invocation. This
syntactic mismatch or hoop is the difference with symbols and lambdas.
The memoization function returns a lambda, if we wanted to use it as a
function we need to use &lt;code&gt;defun&lt;&#x2F;code&gt; or &lt;code&gt;fset&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fset &amp;#39;what&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memoize &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This raises the question what symbol name you should use? Generated or
clobbered? Managing symbols is another task but if we just ignore this
issue and plugin a lambda for a hook, we get this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Written hastily, not representative
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wrapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;func &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; We are wrapping `fn&#x2F;load-project-file&amp;#39; since it needs to take an argument
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memoize
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall wrapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;func &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Looks ugly doesn&#x27;t it, what I find uglier is what is written in
&lt;code&gt;find-file-hook&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (cl-prettyprint find-file-hook)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;progn
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wrapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;func&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wrapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;func&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memoize &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-value &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wrapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;func&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; recentf&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;track&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;opened&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; whitespace&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;turn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-if-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;enabled
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffers
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; #[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;02&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;01!&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;03&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;04!8&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;11&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;07&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; [buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name auto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;revert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tail&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos make&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;variable &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;attributes] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;visual&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffers
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffers
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handlers&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;font&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;check&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffers
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; epa&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; vc&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;refresh&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;state
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;local&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; which&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;func&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ff&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;blogger&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Do you see the &lt;code&gt;lambda&lt;&#x2F;code&gt; standing out from the rest of the symbols? This
happens because anonymous functions are represented as a closure
object. Here lies the crossroad of being functional in Emacs: symbols
overs lambdas.&lt;&#x2F;p&gt;
&lt;p&gt;To express this notion, let me craft a different form for memoization.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;wrapped-symbol&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#wrapped-symbol&quot; aria-label=&quot;Anchor link for: wrapped-symbol&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Wrapped Symbol&lt;&#x2F;h3&gt;
&lt;p&gt;As contrary as this is, it is better to write the wrapped function as
another separate function using &lt;code&gt;defun&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wrapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; There is a bug here, can you figure it out?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;member project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;wrapped-load-project-file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So this version looks a little cleaner but exposes an extra internal
variable &lt;code&gt;fn&#x2F;loaded-projects&lt;&#x2F;code&gt; and an excess wrapper for
&lt;code&gt;fn&#x2F;load-project-file&lt;&#x2F;code&gt;. This is contrary in hiding state in the
functional style.&lt;&#x2F;p&gt;
&lt;p&gt;Strangely, this is easier to debug and test. If you wanted to test
the wrapped function, you set &lt;code&gt;fn&#x2F;loaded-projects&lt;&#x2F;code&gt; to &lt;code&gt;nil&lt;&#x2F;code&gt; or a
value and repeat the test; this is harder to do with a closure. If a
bug is in &lt;code&gt;fn&#x2F;wrapped-load-project-file&lt;&#x2F;code&gt;, you simply reevaluate the
function without having to clean or replace the hook value; with a
closure, you have a bugged and patched hook coexisting.&lt;&#x2F;p&gt;
&lt;p&gt;I intentionally left a bug in &lt;code&gt;fn&#x2F;wrapped-load-project-file&lt;&#x2F;code&gt; to
demonstrate this. Patch then eval the new version. I don&#x27;t have to
think about the hook management.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;wrapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; `projectile-project-root&amp;#39; needs a project first
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;member project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; If you want to reset its state
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This correctly loads &lt;code&gt;fn&#x2F;load-project-file&lt;&#x2F;code&gt; once, what does this tell us anyway?&lt;&#x2F;p&gt;
&lt;h3 id=&quot;symbols-over-function&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#symbols-over-function&quot; aria-label=&quot;Anchor link for: symbols-over-function&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Symbols Over Function&lt;&#x2F;h3&gt;
&lt;p&gt;Am I saying that when I want to memoize a function I need to create
an extra variable and wrapper and expose state? Not really. You
create a memoizing macro that used &lt;code&gt;defun&lt;&#x2F;code&gt; or &lt;code&gt;fset&lt;&#x2F;code&gt; to alleviate
this as with _&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;skeeto&#x2F;emacs-memoize&quot;&gt;emacs-memoize_&lt;&#x2F;a&gt;. In being simple, revealing state and
using symbols seems to be the way to go.&lt;&#x2F;p&gt;
&lt;p&gt;I had struggled with this at first preferring closures, but it does
feel cleaner and simple specially in the context of Emacs. Since
everything is extensible, exposing and manipulating state, declaring
and advicing private functions, hiding things in Emacs seem to
counter the notion of customization.&lt;&#x2F;p&gt;
&lt;p&gt;The notion of encapsulation is not disregarded but rather not
preferred. Since (almost) everything id found via &lt;code&gt;describe-function&lt;&#x2F;code&gt;
or &lt;code&gt;describe-variable&lt;&#x2F;code&gt;, being open is really the way to go. If you
find pain in writing more code for a repeating concept, if
abstracting the state and logic is worth it in simplicity and
extensibility.&lt;&#x2F;p&gt;
&lt;p&gt;I can&#x27;t speak for Scheme or Clojure; for me, Emacs has changed my
hand and mind in writing lisp.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;security&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#security&quot; aria-label=&quot;Anchor link for: security&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Security&lt;&#x2F;h2&gt;
&lt;p&gt;We now shiv a final feature that asks permission or trust in
loading the project files. Let us create a secure wrapper for
&lt;code&gt;fn&#x2F;load-project-file&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Projects that have been loaded by `fn&#x2F;load-project-file&amp;#39;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;safe&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Similar to `fn&#x2F;wrapped-load-project-file&amp;#39; but ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;member project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;safe&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ... asks permission first
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Project script for %s is not trusted.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;loaded&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What we are left with is implementing the symbol &lt;code&gt;fn&#x2F;safe-project-p&lt;&#x2F;code&gt;.
The question is indeed what scheme? A simple scheme is just to use
&lt;code&gt;yes-or-no-p&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;safe&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;yes-or-no-p
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Do you trust the project at %s?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It is as simple as that. Or be more complex and check for last
modified time, expiration period, user ownership and what not. For me,
I simply ask permission as well but allow for a deeper setup if needed
that I am not going to show. I do want to show how to get the last
modified time:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;attribute&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;modification&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; file-attribute-* and its company
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;attributes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  user&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emacs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;directory&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Do explore the other functions such as &lt;code&gt;file-attribute-user-id&lt;&#x2F;code&gt; for
getting file attributes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;persistence&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#persistence&quot; aria-label=&quot;Anchor link for: persistence&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Persistence&lt;&#x2F;h2&gt;
&lt;p&gt;If you use this snippet, you might get annoyed when Emacs opens and
needs permission when running the projects you allowed previously.
What I am talking about is persistence that is a tricky subject in
itself. Several tricks exists for this:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Customize Mechanics&lt;&#x2F;strong&gt;
: But what if you don&#x27;t use a &lt;code&gt;custom-file&lt;&#x2F;code&gt;?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;p-cache&lt;&#x2F;strong&gt;
: Too rich for my blood&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Write the lisp object to file&lt;&#x2F;strong&gt;
: A bit low level&lt;&#x2F;p&gt;
&lt;p&gt;A simpler builtin mechanism exist: &lt;code&gt;savehist&lt;&#x2F;code&gt;. It primarily works for
lispy data and it does save it to a file in &lt;code&gt;savehist-file&lt;&#x2F;code&gt;. I love
the ease of use just by adding the variable symbol to
&lt;code&gt;savehist-additional-variables&lt;&#x2F;code&gt;. To demonstrate in modifying
&lt;code&gt;fn&#x2F;safe-project-p&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checked&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;safe&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checked&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;assocproject&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checked&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Maybe &amp;#39;trusted or &amp;#39;untrusted
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &amp;#39;unchecked&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase checked&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;trusted &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;untrusted &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;unchecked &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; If the project hasn&amp;#39;t been trusted yet
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trusted
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;yes-or-no-p
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Do you trust the project at %s?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checked&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; trusted &amp;#39;trusted &amp;#39;untrusted&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;after&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load &amp;#39;savehist
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;savehist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;additional&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;variables &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;checked&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projects&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The function &lt;code&gt;fn&#x2F;checked-projects&lt;&#x2F;code&gt; is an association list of the
project root string and a symbol of &lt;code&gt;&#x27;trusted&lt;&#x2F;code&gt; or &lt;code&gt;&#x27;untrusted&lt;&#x2F;code&gt; and
what we want to persist. As I mentioned, all you have to do is add it
to &lt;code&gt;savehist-additional-variables&lt;&#x2F;code&gt; and our preference is persisted
without any fuss. Nothing much to say but if you want more details
about this simple persistence &lt;a href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;SaveHist&quot;&gt;SaveHist&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;After all that, the code is still simple to hack without needing to
rely on other packages. Getting work done is more important instead of
being worried by setup and security but still valid concerns.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Princess Tutu - Breaking The Story</title>
          <pubDate>Wed, 15 Feb 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/watcher/princess-tutu-breaking-the-story/</link>
          <guid>https://fnlog.dev/watcher/princess-tutu-breaking-the-story/</guid>
          <description>&lt;h2 id=&quot;princess-tutu&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#princess-tutu&quot; aria-label=&quot;Anchor link for: princess-tutu&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Princess Tutu&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Princess Tutu disregards expectations to support the message&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;After dropping &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Revolutionary%5FGirl%5FUtena&quot;&gt;Revolutionary Girl Utena&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Casshern%5FSins&quot;&gt;Casshern Sins&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FFlowers%5Fof%5FEvil%5F(manga)&quot;&gt;Aku no
Hana&lt;&#x2F;a&gt;, I wanted to remind myself what a good anime is; this is where
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Princess%5FTutu&quot;&gt;Princess Tutu&lt;&#x2F;a&gt; comes in.&lt;&#x2F;p&gt;
&lt;p&gt;By presentation, it is a magical girl show like any other. The plot is
about a duck, a crow, a knight and a prince that appears to be a fairy
tale setting. Behind this cute facade presents the familiar yet
gripping question of free will and fate.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from being a classical music lover, this anime appeals to me not
just on the subversive story but also the use of symphonies and play
with its story. Unlike &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Your%5FLie%5Fin%5FApril&quot;&gt;Your Lie In April&lt;&#x2F;a&gt; where the music is not
strongly tied to the story (since you may change music playing with
dancing or sports or even swords), here it uses different operas and
ballets that tie into the episode theme, mood and story. A more
thorough musical analysis is out there but after hearing the sound
track and listening to a wide range of classics, the music is a true
variation on the existing piece that shows effort in the musical
department. I can&#x27;t say more but I know it is impressive that it just
didn&#x27;t edit the music straight from the public domain. I will say it
is a pleasure to watch and hear specially the opening theme, Morning
Grace, that sets the tone quite well.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, what I want to focus on is how framing and using the story as
a fairy tale supports the theme of fate and free will and not simply as
an aesthetic choice.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;the-fairy-tale.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;SPOILERS AHEAD&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-story&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-story&quot; aria-label=&quot;Anchor link for: the-story&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Story&lt;&#x2F;h2&gt;
&lt;p&gt;Guessing the story from the clues, it is a love story between the duck
turned girl and the prince against the jealous crow princess that
takes its cue from &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FUgly%5FDuckling&quot;&gt;The Ugly Duckling&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Swan%5FLake&quot;&gt;Swan Lake&lt;&#x2F;a&gt;. You don&#x27;t need to
be familiar with them to understand the archetype or structure of a
romantic story like the enchanting &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Wikipedia:Good%5Farticles&quot;&gt;The Little Mermaid&lt;&#x2F;a&gt; or the
subversive &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Shrek&quot;&gt;Shrek&lt;&#x2F;a&gt; or the ever undying &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Romeo%5Fand%5FJuliet%5F(1968%5Ffilm)&quot;&gt;Romeo and Juliet&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;the-first-act.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s first understand the overall story. This anime has twenty-six
episodes or two cours that represents the two acts, short of another
act to make it a three act play. The first act introduces us into the
story episodic proper while the other begins its heavy deviation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-first-act&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-first-act&quot; aria-label=&quot;Anchor link for: the-first-act&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The First Act&lt;&#x2F;h3&gt;
&lt;p&gt;In a nutshell, this act introduces us to the collection mission of
the duck, Ahiru, turned magical ballerina girl, Princess Tutu, into
gathering the lost pieces of the Prince&#x27;s heart, Mytho, who cannot
feel any emotion. Unlike other collection structures where gathering
a key item has no bearing in a story or game such as the classic &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FLegend%5Fof%5FZelda&quot;&gt;The
Legend of Zelda&lt;&#x2F;a&gt;, retrieving a piece of the heart unlocks a new
emotion from the prince such as sorrow, love, fear and so on which
perturbes the peaceful relationships of the cast. The first half of
the anime does appear episodic that seems to culminate in the prince
recovering and unlocking his heart and his love for the swan
princess.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;the-dream-ending.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The episodic structure is used to great effect here as it continually
hints at the overarching story of the anime itself: The Prince and
The Raven. It tells the story of a prince shattering his heart to
seal a dark Raven. Since our hapless protagonist is merely a duck,
she does not know that her mission ultimately brings the Raven back
into existence but the raven is not introduced within the fairy tale
first act. Rather, he is saved for the second act. After the first
act, a few more pieces of the heart remains, the sword of the prince
is broken and a Raven to slay.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;the-prince-and-the-raven.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;In short, the first half establishes the characters as well as subtly
and subvertly fulfilling the story of a fairy tale to break it apart
later with the tragic foreshadowing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-second-act&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-second-act&quot; aria-label=&quot;Anchor link for: the-second-act&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Second Act&lt;&#x2F;h3&gt;
&lt;p&gt;The story of the second act is where the story and more importantly
the characters moves it beyond a magical girl anime to a great one.
The story drops the episodic structure as it moves to a more
character-driven story. It begins with the Prince turning into the
love hungry raven by a devious ploy of the Raven in enchanting or
cursing the fragment of love with his blood making friend turn foe.
On the other hand, the black swan is presented as a mere victim or
puppet to this malevolent being and is show greater depth along with
Fakir within the second act. The pretense of a fairy tale is replaced
by messing with every character, including the side ones.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;the-dark-prince.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The story of the second act is fighting the fate of the book itself,
that is cleverly setup in the first act. Rather, the greater fight
is with the narrator, Drosselmeyer, who has orchestrated everything
and is leading everyone to a tragic ending where the prince has to
shatter his heart again and reset the story instead of concluding it
with a happy ending. Defeating both the story villain and the story
teller is a story in itself.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;the-omniscient-narrator.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The overall theme of the anime is defying fate that we link with
the characters.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-actors&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-actors&quot; aria-label=&quot;Anchor link for: the-actors&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Actors&lt;&#x2F;h2&gt;
&lt;p&gt;At first glance of this anime, I thought it is just another
magical girl show. What let me push through despite the quacky
animation, cliched use of the Nutcracker Suite is how strange the
characters are setup in the beginning:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;quacky-animation.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The Prince without emotions&lt;&#x2F;strong&gt;
: Without it, it is just cliched amnesia. What is weird is that he
is being saved and not the other way around. He is a bland
character by default since he has no emotion that is a play on
the main hero cliche itself.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The considerate Rival&lt;&#x2F;strong&gt;
: Antagonist are almost evil by default; Rue is a better rival as
she merely loves the Prince and not a jerk to Ahiru that rich
girls or rivals are commonly portrayed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The overprotective Knight&lt;&#x2F;strong&gt;
: Fakir is not a romantic interest yet shows strong protective
feelings for the Prince. This is a play on the sidekick
where the trait should have gone to the love rival to make it
cliche. In a sentence, he is making sure his hero-complex
brother doesn&#x27;t kill himself by constraining him, brotherly love
indeed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The story teller&lt;&#x2F;strong&gt;
: Why is there a separate narrator character? Rather, why is the
narrator making plays instead of simply narrating?&lt;&#x2F;p&gt;
&lt;p&gt;I like all the main characters as each do not offend me but I have a
soft spot for the loveable Ahiru, the complicated Fakir and the wise
puppet Edel. The characters are already nuanced in the beginning yet
appearing stereotypical although I understand that they might turn
people off initially if the subversion is not seen and find bland and
generic characters instead.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of describing each character in detail, the ending itself
encapsulate everything: &lt;strong&gt;the Rival gets the Prince.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;not-the-happy-ending.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The ending itself defies the fate of the book. The Rival has true
feelings of love for the Prince yet the Princess just admires him. At
the end, Fakir becomes a writer who counters the influence of
Drosselmeyer yet Ahiru is the same old duck who does not hook up at
the end. The mold is broken for every character and stereotype once
the end is reached although the ending is slightly rushed in certain
aspects.&lt;&#x2F;p&gt;
&lt;p&gt;The anime presents a good job with the theme and message and it should
be obvious why the anime is correct in framing the story within a
story.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-active-story-teller&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-active-story-teller&quot; aria-label=&quot;Anchor link for: the-active-story-teller&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Active Story Teller&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;another-story.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;At the end of the anime, the Story Teller breaks the fourth wall by
acknowledging that the story is over and instead goes to another more
interesting one. This meta awareness adds to the theme of defying what
is written for the characters and the story itself.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;the-wall.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Interestingly, the town itself is part of the story since it is walled
off and nobody gets out including Princess Tutu, adding to the
disempowering fate their tragedy holds. If this meta layer is removed,
Drosselmeyer existence and interference is out of place; rather, he
becomes a Joker or Deus Ex character providing random story
progression with little reason or rhyme.&lt;&#x2F;p&gt;
&lt;p&gt;If the book was the sole foreshadowing element, defying fate is a
consequence of the characters will and not of the story itself. For
example, stories commonly have a prophecy, a legend or internal story
that foreshadows the journey or adventure that the characters
ultimately ignore and defy. By cleverly using a meta-story, it also
defies how the story should even playout or be. For example, even
after changing the fate, the characters themselves fall into the
archetype of their fate such as the heroine and hero hooking up. Here,
the story is a character itself who breaks the mold along with the
characters it plays on.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;the-peaceful-ending.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;By making the narrator an active participant in the story, he is
presented with the same question of fate and obedience. Should he make
a typical fairy tale story or an captivating tragedy? Since he chooses
to make it exciting, he effectively defies his fate and of the story
by exercising his choice. Talking about the meta story gets messy but
this is why the use of the narrator and fourth wall cleverly adds
layer and depth to this story structure. It supports the question of
free will, fate and obedience in such a stronger way.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;princess-tutu-breaking-the-story&#x2F;drosselmeyer.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;This breaking of the story also creates a story in itself that is
ironic for what it is trying to do. Still, it shows that the story is
secondary to the characters will and desire, not of the audience or
narrator. If this is to be taken as the meta message, then write the
story from the characters and not the characters from the story. This
is Drosselmeyer&#x27;s mistake when he focused on the tragedy and not how
the characters change or alter the story.&lt;&#x2F;p&gt;
&lt;p&gt;Indeed, stories are about the actors.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;To wrap up, using the story within a story mechanic for this anime
enriches the question of fate and not merely aesthetic. I deeply
appreciate this anime for not being a simple magical girl series. To
understand why I enjoy this, here are the things I find cliched about
magical girl series:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Long and extraneous transformation&lt;&#x2F;strong&gt;
: Utena and Sailor Moon in particular where the transformation
seems to pad out the run time after seeing it once. At least have
the decency of being short as not to take time.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Shoddy outfits&lt;&#x2F;strong&gt;
: The usual magical girl outfit is to sell merchandise and appeal
to demographics. Although Princess Tutu is effectively wearing a
skirt, it is presented as wholesome and innocent.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Too colorful&lt;&#x2F;strong&gt;
: The color is too bright and colorful in a way to simply
differentiate them as with &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Power%5FRangers&quot;&gt;Power Rangers&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Pretty%5FCure&quot;&gt;Pretty
Cure&lt;&#x2F;a&gt;. Having a toned down color range for Princess
Tutu is such a breath of fresh air.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Heavily Stereotyped&lt;&#x2F;strong&gt;
: Characters are heavily leaning on their personal quirks instead
of being more balanced out of plot contrivances&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Cheesy Romance&lt;&#x2F;strong&gt;
: Although I don&#x27;t lean toward romantic stories, I just dislike it
if the romance is more about the feeling of love instead of the
weight and value of their relationship.&lt;&#x2F;p&gt;
&lt;p&gt;I guess I am jaded with girly shows not having more depth or being
more cute or marketable but this anime is my exception and
recommendation in  many ways despite the flaws. (I have seen &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Puella%5FMagi%5FMadoka%5FMagica&quot;&gt;Puella
Magi Madoka Magica&lt;&#x2F;a&gt; which some depth but I prefer the overall meaning
and package of this anime.)&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Notifying prodigy With Fringe alert</title>
          <pubDate>Wed, 08 Feb 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/notifying-prodigy-with-fringe-alert/</link>
          <guid>https://fnlog.dev/dev/notifying-prodigy-with-fringe-alert/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;The Elisp library &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;prodigy.el&quot;&gt;prodigy.el&lt;&#x2F;a&gt; helps you manage your external processes;
in particular, it allows you to listen to the process log which allows
you to execute commands on certain states. Although we have
&lt;code&gt;start-process&lt;&#x2F;code&gt; and &lt;code&gt;set-process-filter&lt;&#x2F;code&gt;, this library wraps those
lower level constructs into a more manageable object with hooks and
properties.&lt;&#x2F;p&gt;
&lt;p&gt;One common feature when using processes is to be notified when it is
ready or something happens. For example, I use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;OfflineIMAP&#x2F;offlineimap&quot;&gt;offlineimap&lt;&#x2F;a&gt; with &lt;code&gt;gnus&lt;&#x2F;code&gt;
to get my mail where I want to be notified when there is one or &lt;a href=&quot;http:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;jekyll&lt;&#x2F;a&gt;
to make this blog where I want to told when the blog is built
successfully or not. I could use the simple &lt;code&gt;message&lt;&#x2F;code&gt; construct but to
be more flexible I use the library &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jwiegley&#x2F;alert&quot;&gt;alert&lt;&#x2F;a&gt;.el.&lt;&#x2F;p&gt;
&lt;p&gt;That notifying library features more than just using &lt;code&gt;message&lt;&#x2F;code&gt;, it can
use &lt;code&gt;libnotify&lt;&#x2F;code&gt;, &lt;code&gt;growl&lt;&#x2F;code&gt; and more importantly the &lt;code&gt;fringe&lt;&#x2F;code&gt;. A &lt;code&gt;fringe&lt;&#x2F;code&gt;
alert uses &lt;code&gt;set-face-background&lt;&#x2F;code&gt; to change the color of the buffer
sides and removes it on action. You can try this one liner to
understand better:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;background &amp;#39;fringe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;red&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So when there is a process event, I want a fringe alert. I have no
snippet to give here only an outline on how I went about it. For this
post, I will use &lt;code&gt;jekyll&lt;&#x2F;code&gt; as an example.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;using-prodigy&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#using-prodigy&quot; aria-label=&quot;Anchor link for: using-prodigy&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Using &lt;code&gt;prodigy&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To define a &lt;code&gt;jekyll&lt;&#x2F;code&gt; process with &lt;code&gt;prodigy&lt;&#x2F;code&gt;, here is how you will go
about it:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Gnus-Offlineimap&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Service name or id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :cwd &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;Fakespace&#x2F;fnlog.io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Working directory when the service is called
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :command &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; The jekyll command
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :args &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list                      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Command arguments
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--drafts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--ports&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;number&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;34000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :port &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;34000                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Optional port property
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :kill&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;signal &amp;#39;sigkill         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Kill signal to send when closing
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :on&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;ignore           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; The output listener we are interested in
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is more or less how I setup my blog process service but I use the
tag system to make it a more reusable. To emphasize convenience, I
would use this library instead of handling it with &lt;code&gt;start-process&lt;&#x2F;code&gt;,
&lt;code&gt;with-temp-buffer&lt;&#x2F;code&gt; and &lt;code&gt;default-directory&lt;&#x2F;code&gt;. To get a better picture,
you can see the new service with a special tabulated and process
buffer.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;notifying-prodigy-with-fringe-alert&#x2F;prodigy-screenshot.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;What we are interested in with the logs are two lines that contain
the string&#x2F;text:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Server running&lt;&#x2F;code&gt; to indicate the blog is &lt;code&gt;ready&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;...done in&lt;&#x2F;code&gt; to indicate the blog is &lt;code&gt;built&lt;&#x2F;code&gt; and should be refreshed&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The &lt;code&gt;:on-output&lt;&#x2F;code&gt; allows us to tap into this which takes a function
with a plist argument that has &lt;code&gt;:service&lt;&#x2F;code&gt; and &lt;code&gt;:output&lt;&#x2F;code&gt; properties. In
our context of listenting to the following lines:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;state&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;change&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;listener &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;rest args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;defun* can also work
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get args :output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Get the arguments
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get args :service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pred &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Server running&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;status service &amp;#39;ready&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Manually set the status
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Trigger ready alert
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pred &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Error:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Trigger error alert
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pred &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;...done&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Trigger done built alert
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Do nothing otherwise
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Redefining the service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Previous definition
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :on&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;state&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;change&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;listener
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you don&#x27;t have &lt;code&gt;string-match-p&lt;&#x2F;code&gt; since you are using an earlier
version, it can be shivved like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;unless &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fboundp &amp;#39;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defsubst string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;regexp string &amp;amp;optional start&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;\
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Same as `string-match&amp;#39; except this function does not change the match data.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Taken from `subr-x&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;inhibit&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;changing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match regexp string start&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from using &lt;code&gt;pcase&lt;&#x2F;code&gt;, it is pretty much just listening to the
output. As an aside, listening to the output is pretty much determined
by the process itself; so some awkward log state management might be
present for other services. For example, there might be a start line,
then followed by either an error or process line, finally an end line;
in that scenario, one has to keep track if there is an error or not to
determine at the end line if there is an error instead of notifying at
each one. Logging and state machines, some nuances when dealing with
listening to logs.&lt;&#x2F;p&gt;
&lt;p&gt;We move on to using &lt;code&gt;alert&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;using-alert&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#using-alert&quot; aria-label=&quot;Anchor link for: using-alert&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Using &lt;code&gt;alert&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Using &lt;code&gt;alert&lt;&#x2F;code&gt; is pretty straightforward, the first argument is the
message and the rest are some options. I encourage you to check it out
but for our case, we will be focused on using the fringe type:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Hello Alert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Default alert with message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Hello Fringe Alert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Using a fringe alert
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       :severity &amp;#39;trivial
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       :style &amp;#39;fringe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you use this snippet, you will get a purple fringe alert which
comes from &lt;code&gt;alert-severity-colors&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;urgent . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;red&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;high . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;orange&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;moderate . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;yellow&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;normal . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;green&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;low . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;blue&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trivial . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;purple&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Weirdly, the severity handles the color. Either way, there isn&#x27;t many
colors to work with, so if you want to add one like &lt;code&gt;Rebecca Purple&lt;&#x2F;code&gt;
or &lt;code&gt;Lavender&lt;&#x2F;code&gt;. You have to add to do the following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;functions
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons &amp;#39;lavender &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;alert--log-trace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;colors
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons &amp;#39;lavender &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#b378d3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;My lavender alert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       :style &amp;#39;fringe
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       :severity &amp;#39;lavender&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is not so bad but when you have several services that uses fringe
alerts or have to create one, you might want a function that does
this. Here is my version of that function after looking at the source:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defun&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &amp;amp;rest args &amp;amp;key color &amp;amp;allow&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;other&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;keys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A custom alert that focuses on defining a fringe with COLOR key
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;with a hex value.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Step 01: Create hex color symbol
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;regexp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; color&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Prepend alert-color-- to the hex code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;alert-color--%s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Check if the symbol exists or default
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;intern&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;soft hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;intern hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Step 02: Add the symbol pair to the lists
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;unless &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;assoc hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;functions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;functions
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;alert--log-trace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;unless &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;assoc hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;colors&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;severity&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;colors &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol color&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Step 03: Handle an extra :color property that
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;          defaults :style and :severity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          :style &amp;#39;fringe
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          :severity hex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;colorless&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reduce &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Just removes :color from the property list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;val props&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;equal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :color val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr props&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons val props&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          args
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          :&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;end &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          :initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;alert
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;append
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          color&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          colorless&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although a little long, this encapsulates the symbol creation, adding
to the lists and handling a &lt;code&gt;:color&lt;&#x2F;code&gt; property. It does not handle more
fine grained severity options and it might not property decorate
around &lt;code&gt;alert&lt;&#x2F;code&gt; but it does the job. You can see it in action here:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Here is my colored alert&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#123456&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the interest of being canonical with &lt;code&gt;alert&lt;&#x2F;code&gt;, I would have defined
a custom style but I could not get a custom property or argument like
&lt;code&gt;:color&lt;&#x2F;code&gt; to be used; I could have reused &lt;code&gt;:severity&lt;&#x2F;code&gt; but it doesn&#x27;t
fit the context. So I had to create a decorator for a custom color
property despite the ease of doing the following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Copied from alert-fringe-
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flash&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;notify &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;background &amp;#39;fringe &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get info :color&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flash&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;restore &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;copy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face &amp;#39;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;saved&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fringe&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face &amp;#39;fringe&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;style &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flash
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    :title &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Change the fringe color&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    :notifier &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;alert-flash-notify
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    :remover &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;alert-flash-restore&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; If it did work...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Here is a simpler alert.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       :style &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flash
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       :color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#123456&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So now we can get a colored fringe alert without handling the symbols
and lists.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;combining-alert-and-prodigy&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#combining-alert-and-prodigy&quot; aria-label=&quot;Anchor link for: combining-alert-and-prodigy&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Combining &lt;code&gt;alert&lt;&#x2F;code&gt; and &lt;code&gt;prodigy&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Now that we have the two we can easily merge them in the following
snippet:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;state&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;change&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;listener &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;rest args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;defun* can also work
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get args :output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Get the arguments
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get args :service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pred &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Server running&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;status service &amp;#39;ready&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Manually set the status
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Blog is up and running&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                       :color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#01dddd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pred &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Error:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Blog has a build error. Check out the logs.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                       :color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#fd8a5e&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pred &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;...done&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Blog has successfully been built.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                       :color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;#e0e300&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Do nothing otherwise
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With that, everything should be in order; however, what I did instead
is created a hook so that other actions aside might be taken based on
its state. As an example, I check the blog&#x27;s output using &lt;code&gt;w3m&lt;&#x2F;code&gt; and
when the blog is built, I want to reload all the web buffers
pertaining to my blog. This snippet does it:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;state&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reload &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service state&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase state &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; My hook takes a service and state argument
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;built
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;window&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;excursion
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapc
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ignore-errors
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parts &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;http&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;host &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elt parts &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;port &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elt parts &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; port &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;34000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; host &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;127.0.0.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reload&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;_ &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; The hook I created, modified for this post
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;state&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;change&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;prodigy-jekyll-state-w3m-reload&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That&#x27;s the thing about &lt;code&gt;:on-output&lt;&#x2F;code&gt;, you can&#x27;t add to it like a hook
so you have to make one. Using the output as a hook, I have an alert
and auto-reload mechanism.&lt;&#x2F;p&gt;
&lt;p&gt;Lastly, if you forgot the meaning of the color, it would be nice if
there was also a message to back it up. By default, using this style
of the alert produces no minibuffer message to appear which is
appropriate. However, I would like to be reminded what it means with
this snippet:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fringe&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;notify&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Log `fringe&amp;#39; style with `message&amp;#39;.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;     This is to support `fn&#x2F;alert-color&amp;#39; if the color flash needs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;     a reminder.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get info :message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;advice&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add &amp;#39;alert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fringe&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;notify :after &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;alert-fringe-notify-message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Or you could add that to &lt;code&gt;fn&#x2F;alert-color&lt;&#x2F;code&gt; if advicing is overkill.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Now that we have candied alerts for our services, what else can be
done with these libraries?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Service dependencies&lt;&#x2F;li&gt;
&lt;li&gt;Log alerts to file&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If more services such as &lt;code&gt;react-native&lt;&#x2F;code&gt; come and go, we can now easily
creates alerts for it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Song Of The Sea - Justifying The Song</title>
          <pubDate>Wed, 08 Feb 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/watcher/song-of-the-sea-justifying-the-song/</link>
          <guid>https://fnlog.dev/watcher/song-of-the-sea-justifying-the-song/</guid>
          <description>&lt;h2 id=&quot;song-of-the-sea&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#song-of-the-sea&quot; aria-label=&quot;Anchor link for: song-of-the-sea&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Song of the Sea&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Song%5Fof%5Fthe%5FSea%5F%25282014%5Ffilm%2529&quot;&gt;Song of the Sea (2014)&lt;&#x2F;a&gt; is one of the best hand drawn film I have ever
seen from &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Cartoon%5FSaloon&quot;&gt;Cartoon Saloon&lt;&#x2F;a&gt;, rivaling the likes the works of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Studio%5FGhibli&quot;&gt;Studio
Ghibli&lt;&#x2F;a&gt;. Not surprising since the other work I enjoy from them is &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FSecret%5Fof%5FKells&quot;&gt;The
Secret of Kells&lt;&#x2F;a&gt; which is another excellent work to behold.&lt;&#x2F;p&gt;
&lt;p&gt;What I want to talk about in this short article is about the song. In
particular, why the song seem to have changed the scope of the story
which some people find some trouble with.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;SPOILER AHEAD&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;saoirse-s-song&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#saoirse-s-song&quot; aria-label=&quot;Anchor link for: saoirse-s-song&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Saoirse&#x27;s Song&lt;&#x2F;h2&gt;
&lt;p&gt;The question is why did Saoirse&#x27;s song save not just herself but also
the spirits in the story?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;song-of-the-sea-justifying-the-song&#x2F;saoirse-song.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;All that is expected of the song is that it saves her so saving the
surrounding spirits around her seems to come out of nowhere. On my
first viewing, I did not see it coming so I see why people think
similarly. Did the film foreshadow her song would save the spirits?&lt;&#x2F;p&gt;
&lt;p&gt;The most practical answer I can give is that something needed to
happen within the four minutes she was singing. If not, it would be a
scene of her spinning and singing in the air which might not be the
most visually meaningful. However, I refuse to believe the song is
just a filler music video clip, so let us look deeper in the film.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;from-the-script&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#from-the-script&quot; aria-label=&quot;Anchor link for: from-the-script&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
From The Script&lt;&#x2F;h2&gt;
&lt;p&gt;Reading into the script, there are several lines indicating that it
would. In the early scenes, Ben shows his father the picture on the
wall and says:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;BEN: She&amp;#39;s singing her song so that she can send all the fairies home
&lt;&#x2F;span&gt;&lt;span&gt;across the sea.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Another reminder is right before the musical Deenashee is petrified,
one of them says:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;DEENASHEE: Human child, find the selkie&amp;#39;s true coat, then she can sing
&lt;&#x2F;span&gt;&lt;span&gt;the song and save us all.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The Great Senachai says something that is more direct:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;GREAT SENACHIA: She&amp;#39;ll be turned to stone soon, no doubt. You see,
&lt;&#x2F;span&gt;&lt;span&gt;without her coat, the selkie has no voice. And without her song, she&amp;#39;ll
&lt;&#x2F;span&gt;&lt;span&gt;not last the night. And we&amp;#39;ll all share in her fate.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The last sentence is very strange yet indicative of the stake involved
in saving Saoirse. So is the saving song foreshadowed enough? I don&#x27;t
think so since these are just a couple of lines that one could easily
miss. A good foreshadowing would be a scene involving Bronach or other
selkies singing and having the same effect, so at best it is only
hinted at.&lt;&#x2F;p&gt;
&lt;p&gt;Instead, did the song need to save the spirits? Would the film change
if Saoirse was only healed and went back home? So let&#x27;s explore the
meaning of the song.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bronach-s-song&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bronach-s-song&quot; aria-label=&quot;Anchor link for: bronach-s-song&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Bronach&#x27;s Song&lt;&#x2F;h2&gt;
&lt;p&gt;To be fair, it is known that Saoirse and her voice is magical.
Saoirse&#x27;s stifiled singing through the shell was enough to break
Macha&#x27;s magic; what more if is she used her true voice? (This is
speculation as power levels aren&#x27;t really established anyway.) She was
only able to sing after Ben taught her their mother&#x27;s song.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;song-of-the-sea-justifying-the-song&#x2F;ben-teaching-the-song.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Which is weird why Ben hasn&#x27;t taught her the song before after six
years of being siblings but that further cements how important the
song is. Ben is the only one who has their mother&#x27;s legacy: not the
coat, not the shell, but the tales and the song.&lt;&#x2F;p&gt;
&lt;p&gt;There is a fascinating line that their mother mentions before leaving:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;BRONACH: My son. Remember me, in your stories and in your songs. Know
&lt;&#x2F;span&gt;&lt;span&gt;that I will always love you. Always.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is a clever narrative use of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Oral%5Ftradition&quot;&gt;oral tradition&lt;&#x2F;a&gt;: passing on the song
is passing on the memory and love. Ben teaching her the song is not
only symbolic of his forgiveness but also passing the love and legacy
of thier mother.&lt;&#x2F;p&gt;
&lt;p&gt;So the song is symbolically and thematically about love but how does
this factor in saving the spirits? At the very least though, the song
itself has meaning to exist.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-selkie-s-duty&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-selkie-s-duty&quot; aria-label=&quot;Anchor link for: the-selkie-s-duty&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Selkie&#x27;s Duty&lt;&#x2F;h2&gt;
&lt;p&gt;It is interesting to note why their mother wasn&#x27;t able to sing and
free the spirits from Macha&#x27;s grasp earlier.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;song-of-the-sea-justifying-the-song&#x2F;bronach-singing.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Clearly, Bronach can sing and Mac Lir is just outside. So why hasn&#x27;t
she? Rather, it might not be that she won&#x27;t but she can&#x27;t. I think
Bronach might have no longer any magic or is waning. It might be
because she chooses to love Conor similar to &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FLittle%5FMermaid&quot;&gt;The Little Mermaid&lt;&#x2F;a&gt;. By
having little or no magic, giving birth to Saoirse might have taken
all that Bronach had remaining, which makes more sense in the context
of Ben being human and not a magical being.&lt;&#x2F;p&gt;
&lt;p&gt;Whatever the circumstance of the spirit or magical world, she cannot
sing to her duty as a selkie, which might be considered taboo or
illegal and adds a layer to her being a woman. Hence, the duty of the
mother falls onto the daughter.&lt;&#x2F;p&gt;
&lt;p&gt;What we need from the song is simply to call their mother and give
Saoirse the pivotal choice of staying or leaving with Ben. By singing
the song and sending the spirits home which not only fulfills
Bronach&#x27;s neglected duty but makes her a selkie. This in turn calls
their mother&#x27;s spirit and intends to take Saoirse as a selkie. From
this, we might infer that Bronach can&#x27;t seem to cross to the human
world without a selkie&#x27;s song guiding her to and from. Even without
thinking about the backstory, Bronach says this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;BRONACH: All of my kind must leave tonight. But, Saoirse, you are part
&lt;&#x2F;span&gt;&lt;span&gt;human. If I take her coat, our worlds will be untangled.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So sending the spirits home is pivotal to give Saoirse the choice of
not only staying but forgiving Ben. If Saoirse left to be with her
mother, it would mean Ben hasn&#x27;t been good enough as a brother for her
to stay. So she forgives Ben by staying instead of leaving the person
who hurts or disregards her. Forgiving someone isn&#x27;t simply a
conversation.&lt;&#x2F;p&gt;
&lt;p&gt;Interestingly, without the choice, forgiving Ben would not mean
anything without any narrative or personal impact. Saoirse, Ben and
Conor would simply be back home without much ado about nothing. The
film is quite clever in setting the stakes. (Who wants to lose their
beloved little sister?)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;other-subtleties&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-subtleties&quot; aria-label=&quot;Anchor link for: other-subtleties&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Other Subtleties&lt;&#x2F;h2&gt;
&lt;p&gt;There are more subtleties that help in reading the film as a whole.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;doubles&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#doubles&quot; aria-label=&quot;Anchor link for: doubles&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Doubles&lt;&#x2F;h3&gt;
&lt;p&gt;Notice how the human and spirit world are similar or paralled in this
film. Mac Lear and Conor, Granny and Macha, Dan and The Great
Senechai, Saoirse and Bronach are human and spirit world equivalents
or doubles. Appearing to look similar and even the voice actors are
the same, this use of doubles or parallels heighten the only
character without a double: Ben. The hero&#x27;s journey, growth and
forgiveness of Ben is further magnified.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;circle&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#circle&quot; aria-label=&quot;Anchor link for: circle&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Circle&lt;&#x2F;h3&gt;
&lt;p&gt;Notice the use of circles is very strong. More importantly, the use
of it emphasizes how everything is connected and how the film is
centered around a family.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;song-of-the-sea-justifying-the-song&#x2F;circle-within-circles.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;I believe the image above is the most helpful in reading the film.
Everything tied in one circle of tales.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-human-and-the-spirit-world&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-human-and-the-spirit-world&quot; aria-label=&quot;Anchor link for: the-human-and-the-spirit-world&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Human And The Spirit World&lt;&#x2F;h3&gt;
&lt;p&gt;The two previous fact heighten this fact: there is no distinction
between the two worlds. In most films, there is a portal or gateway
to the other world but in this film it blurs the line as the same.
The world of the magical is no more different from the world of the
real; this subtlely works quite well in showing how the problem and
resolution of the family and the world is almost the same.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;I could have just said Saoirse needed to be a selki but we needed to
understand the meaning or weight of the song and what it allowed. In
the end, the song has such a sublime serenity and catharsis that one
cannot deny. For a film to have this depth and subtlety of choice, it
makes me appreciate it more. That is why I believe this is one of the
best films to watch that is both accessible yet sublime.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Browsing w3m Anonymously With tor</title>
          <pubDate>Wed, 01 Feb 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/browsing-w3m-anonymously-with-tor/</link>
          <guid>https://fnlog.dev/dev/browsing-w3m-anonymously-with-tor/</guid>
          <description>&lt;p&gt;&lt;strong&gt;UPDATE: 2017-01-24: Add https proxy to the command arguments.&lt;&#x2F;strong&gt;
&lt;strong&gt;Also, updating style and grammar.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;m having fun with &lt;a href=&quot;http:&#x2F;&#x2F;w3m.sourceforge.net&#x2F;&quot;&gt;w3m&lt;&#x2F;a&gt; on Emacs but by using this I discarded several
features I have neglected with a GUI: private browsing. This is useful
if prying eyes were desperate enough to check the terminal browser for
browsing history. Gluing it to ignore several sites is simple enough
that might warrant a post itself.&lt;&#x2F;p&gt;
&lt;p&gt;Even with &lt;a href=&quot;https:&#x2F;&#x2F;www.mozilla.org&#x2F;en-US&#x2F;firefox&#x2F;new&#x2F;&quot;&gt;firefox&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;www.google.com&#x2F;chrome&#x2F;browser&#x2F;desktop&#x2F;index.html&quot;&gt;chrome&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;duckduckgo.com&#x2F;l&#x2F;?kh=-1&amp;amp;uddg=https%253A%252F%252Fsupport.mozilla.org%252Fen%252DUS%252Fkb%252FPrivate%252520Browsing&quot;&gt;private browsing&lt;&#x2F;a&gt; may not be enough as
servers can track your IP and infer which sites you went to. Not truly
private but good enough against nosy users. Enter &lt;a href=&quot;https:&#x2F;&#x2F;www.torproject.org&quot;&gt;tor&lt;&#x2F;a&gt;, the anonymizing
web proxy, that routes HTTP requests through several proxies&#x2F;relays
and adding layers of encryption between them to mask where the request
comes from. Despite slowing down browsing speed, it will keep those
pesky trackers and advertisers from scarily guessing what books or
movies you secretly want.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly, &lt;code&gt;tor&lt;&#x2F;code&gt; is a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;SOCKS&quot;&gt;SOCKS proxy&lt;&#x2F;a&gt; and &lt;code&gt;w3m&lt;&#x2F;code&gt; uses only &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Proxy%5Fserver&quot;&gt;HTTP proxies&lt;&#x2F;a&gt;. This
means it isn&#x27;t as quick and straightforward joining the two, thus we
need a middleman. Enter &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Polipo&quot;&gt;polipo&lt;&#x2F;a&gt;, a caching HTTP proxy that is
lightweight for the experiment. To finalize, &lt;code&gt;w3m&lt;&#x2F;code&gt; will use &lt;code&gt;polipo&lt;&#x2F;code&gt;
as its HTTP proxy which in turn uses &lt;code&gt;tor&lt;&#x2F;code&gt; as its SOCKS proxy to send
the request.&lt;&#x2F;p&gt;
&lt;p&gt;With that idea, here is the &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;0bf59110d447138d7d0a6d227d80f9a4&quot;&gt;snippet&lt;&#x2F;a&gt; that glues them. The first time
you run this, &lt;code&gt;tor&lt;&#x2F;code&gt; might take some time setting up thus be patient.
As hackers, we want elaboration.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;configuration-generation&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#configuration-generation&quot; aria-label=&quot;Anchor link for: configuration-generation&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Configuration Generation&lt;&#x2F;h2&gt;
&lt;p&gt;Once you installed and tried both &lt;code&gt;tor&lt;&#x2F;code&gt; and &lt;code&gt;polipo&lt;&#x2F;code&gt;, we want Emacs to
start these proxies for us when we start &lt;code&gt;w3m&lt;&#x2F;code&gt;. They can be configured
as external services or daemons; instead, we want portable setups that
minimize external dependencies and conflicts.&lt;&#x2F;p&gt;
&lt;p&gt;To start an external process, we use &lt;code&gt;start-process&lt;&#x2F;code&gt;. Practically, we
want it to call both proxies and their respective command line
options; however, generating their respective configuration files via
Elisp is more interesting. A minor bonus, the configuration can be
tested and examined externally.&lt;&#x2F;p&gt;
&lt;p&gt;Both configurations can be abstracted as a list of key-value pairs or
cons with different line formatting. A basic formatter for this with
&lt;code&gt;tor&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;(with-temp-file config-file ;; Config file path
&lt;&#x2F;span&gt;&lt;span&gt;  (insert
&lt;&#x2F;span&gt;&lt;span&gt;   (string-join
&lt;&#x2F;span&gt;&lt;span&gt;    (mapcar
&lt;&#x2F;span&gt;&lt;span&gt;     (lambda (pair)
&lt;&#x2F;span&gt;&lt;span&gt;       (pcase-let ((`(,key . ,value) pair))
&lt;&#x2F;span&gt;&lt;span&gt;         (format
&lt;&#x2F;span&gt;&lt;span&gt;          &amp;quot;%s %s&amp;quot; ;; Line formatting
&lt;&#x2F;span&gt;&lt;span&gt;          key ;; Key formatting
&lt;&#x2F;span&gt;&lt;span&gt;          (typecase value ;; Value formatting
&lt;&#x2F;span&gt;&lt;span&gt;            (symbolp (symbol-name value))
&lt;&#x2F;span&gt;&lt;span&gt;            (numberp (number-to-string value))
&lt;&#x2F;span&gt;&lt;span&gt;            (stringp value)))))
&lt;&#x2F;span&gt;&lt;span&gt;     pairs ;; The cons list
&lt;&#x2F;span&gt;&lt;span&gt;     )
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;\n&amp;quot;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from using the helpful &lt;code&gt;with-temp-file&lt;&#x2F;code&gt; macro and destructring
&lt;code&gt;pcase-let&lt;&#x2F;code&gt;, the only nuance here is the value formatting via
&lt;code&gt;typecase&lt;&#x2F;code&gt;. How you do the formatting affects what values you place.
For example with &lt;code&gt;polipo&lt;&#x2F;code&gt;, our list of &lt;code&gt;cons&lt;&#x2F;code&gt; with some stylistic
backquoting looks something like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;`((&amp;quot;proxyAddress&amp;quot; . &amp;quot;0.0.0.0&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;allowedClients&amp;quot; . &amp;quot;127.0.0.1&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;diskCacheRoot&amp;quot; . ,fn&#x2F;w3m-polipo-cache-dir)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;proxyPort&amp;quot; . ,fn&#x2F;w3m-polipo-port)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;cacheIsShared&amp;quot; . false)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;socksParentProxy&amp;quot; .
&lt;&#x2F;span&gt;&lt;span&gt;   ,(format &amp;quot;%s:%s&amp;quot; &amp;quot;localhost&amp;quot; (number-to-string fn&#x2F;w3m-tor-port)))
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;socksProxyType&amp;quot; . socks5))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although the key types are the same, notice there are different value
types. Strings are quoted, numbers and symbols are stringified; if we
used just list of line strings, we&#x27;d have to do the formatting
ourselves. With this setup, it looks configurable and proper. A caveat
to this is than when a value is changed, the files and processes needs
to be updated or refreshed. This is natural since this is external to
Emacs. Wrapping the generation as a function,
&lt;code&gt;fn&#x2F;w3m-polipo-tor-update-conf&lt;&#x2F;code&gt;, it is not a big issue to invoke it
each time.&lt;&#x2F;p&gt;
&lt;p&gt;As an aside, &lt;code&gt;customize-set-variable&lt;&#x2F;code&gt; has some data binding mechanism
through &lt;code&gt;:set&lt;&#x2F;code&gt; and &lt;code&gt;:get&lt;&#x2F;code&gt; property but it isn&#x27;t necessary for a small
shiv. Also, it is fascinating how generating the files with Elisp
binds the data and code.&lt;&#x2F;p&gt;
&lt;p&gt;We now talk about the options we are interested in since I am assuming
you didn&#x27;t really read the manuals.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tor-options&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#tor-options&quot; aria-label=&quot;Anchor link for: tor-options&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
tor Options&lt;&#x2F;h2&gt;
&lt;p&gt;The configuration values for &lt;code&gt;tor&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;`((&amp;quot;SocksPort&amp;quot; . ,fn&#x2F;w3m-tor-port)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;DataDirectory&amp;quot; . ,fn&#x2F;w3m-tor-cache-dir)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;ControlPort&amp;quot; . ,(1+ fn&#x2F;w3m-tor-port))
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;DisableDebuggerAttachment&amp;quot; . 0))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;SocksPort&lt;&#x2F;strong&gt;
: The port it listens to. This port is what &lt;code&gt;polipo&lt;&#x2F;code&gt; points to.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;DataDirectory&lt;&#x2F;strong&gt;
: The directory it uses. Optional, but must be changed since it
defaults to a system directory&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;ControlPort&lt;&#x2F;strong&gt;
: Optional debugging port if you want to monitor it with tools such
as &lt;a href=&quot;https:&#x2F;&#x2F;www.torproject.org&#x2F;index.html.en&quot;&gt;arm&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;DisableDebuggerAttachment&lt;&#x2F;strong&gt;
: If you want to monitor, set this flag&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#081724;color:#f8f8f2;&quot;&gt;&lt;code&gt;&lt;span&gt;All we strictly need is the **SocksPort** or the interface port and
&lt;&#x2F;span&gt;&lt;span&gt;everything else is for portability.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;polipo-options&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#polipo-options&quot; aria-label=&quot;Anchor link for: polipo-options&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
polipo Options&lt;&#x2F;h2&gt;
&lt;p&gt;The configuration values for &lt;code&gt;polipo&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;`((&amp;quot;proxyAddress&amp;quot; . &amp;quot;0.0.0.0&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;allowedClients&amp;quot; . &amp;quot;127.0.0.1&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;diskCacheRoot&amp;quot; . ,fn&#x2F;w3m-polipo-cache-dir)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;proxyPort&amp;quot; . ,fn&#x2F;w3m-polipo-port)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;cacheIsShared&amp;quot; . false)
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;socksParentProxy&amp;quot; .
&lt;&#x2F;span&gt;&lt;span&gt;   ,(format &amp;quot;%s:%s&amp;quot; &amp;quot;localhost&amp;quot; (number-to-string fn&#x2F;w3m-tor-port)))
&lt;&#x2F;span&gt;&lt;span&gt;  (&amp;quot;socksProxyType&amp;quot; . socks5))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;proxyAddress&lt;&#x2F;strong&gt;
: The address this listens to. For portability, &lt;strong&gt;localhost&lt;&#x2F;strong&gt; is the
value.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;allowedClients&lt;&#x2F;strong&gt;
: The IP address allowed. Portability again, &lt;strong&gt;localhost&lt;&#x2F;strong&gt; is the value.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;diskCacheRoot&lt;&#x2F;strong&gt;
: Like with &lt;code&gt;tor&lt;&#x2F;code&gt; and &lt;strong&gt;DataDirectory&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;proxyPort&lt;&#x2F;strong&gt;
: The port this listens to. This port is what &lt;code&gt;w3m&lt;&#x2F;code&gt; uses.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;cacheIsShared&lt;&#x2F;strong&gt;
: Set to true if the configuration is used by only one instance.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;socksParentProxy&lt;&#x2F;strong&gt;
: The SOCKS proxy port it listens to. This port is the meeting of
&lt;code&gt;tor&lt;&#x2F;code&gt; and &lt;code&gt;polipo&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;socksProxyType&lt;&#x2F;strong&gt;
: The SOCKS proxy type. The default &lt;code&gt;socks5&lt;&#x2F;code&gt; is what &lt;code&gt;tor&lt;&#x2F;code&gt; is.&lt;&#x2F;p&gt;
&lt;p&gt;A little more nuanced since it is the middle man. What is strictly
needed here is &lt;strong&gt;proxyPort&lt;&#x2F;strong&gt; and &lt;strong&gt;socksParentProxy&lt;&#x2F;strong&gt; which are just the
interface ports.&lt;&#x2F;p&gt;
&lt;p&gt;Now that the options are clear, we move to our browser options.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;w3m-options&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#w3m-options&quot; aria-label=&quot;Anchor link for: w3m-options&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
w3m Options&lt;&#x2F;h2&gt;
&lt;p&gt;We now look at the main browser and the only external option it needs,
&lt;code&gt;http_proxy&lt;&#x2F;code&gt;. This is simply adding to &lt;code&gt;w3m-command-arguments&lt;&#x2F;code&gt; the
value &lt;code&gt;http_proxy=https:&#x2F;&#x2F;127.0.0.1:&amp;lt;polipo-port&amp;gt;&lt;&#x2F;code&gt; after &lt;code&gt;-o&lt;&#x2F;code&gt; option.
Aside, a nuance is also duplicating it for &lt;code&gt;https_proxy&lt;&#x2F;code&gt; as such:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;(setq w3m-command-arguments
&lt;&#x2F;span&gt;&lt;span&gt;   (append w3m-command-arguments
&lt;&#x2F;span&gt;&lt;span&gt;           (list &amp;quot;-o&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;              (format
&lt;&#x2F;span&gt;&lt;span&gt;               &amp;quot;http_proxy=http:&#x2F;&#x2F;127.0.0.1:%s&#x2F;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;               fn&#x2F;w3m-privoxy-port))
&lt;&#x2F;span&gt;&lt;span&gt;           (list &amp;quot;-o&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;              (format
&lt;&#x2F;span&gt;&lt;span&gt;               &amp;quot;https_proxy=https:&#x2F;&#x2F;127.0.0.1:%s&#x2F;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;               fn&#x2F;w3m-privoxy-port))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To note, &lt;code&gt;w3m&lt;&#x2F;code&gt; has its own configuration thus this configuration can
be set there but it does ruin the data and code binding. It is now
just a matter of calling the appropriate processes when &lt;code&gt;w3m&lt;&#x2F;code&gt; loads:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;(setq fn&#x2F;w3m-tor-process
&lt;&#x2F;span&gt;&lt;span&gt;   (start-process &amp;quot;w3m-tor&amp;quot; &amp;quot;*w3m-tor*&amp;quot; &amp;quot;tor&amp;quot; &amp;quot;-f&amp;quot; fn&#x2F;w3m-tor-conf-file)
&lt;&#x2F;span&gt;&lt;span&gt;   fn&#x2F;w3m-polipo-process
&lt;&#x2F;span&gt;&lt;span&gt;   (start-process &amp;quot;w3m-polipo&amp;quot; &amp;quot;*w3m-polipo*&amp;quot; &amp;quot;polipo&amp;quot; &amp;quot;-c&amp;quot; fn&#x2F;w3m-polipo-conf-file))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from managing the processes, all the pieces should work together
properly.&lt;&#x2F;p&gt;
&lt;p&gt;If you don&#x27;t need anonymity for some specialized hosts or domain, set
it via &lt;code&gt;w3m-no-proxy-domains&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;(add-to-list &amp;#39;w3m-no-proxy-domains &amp;quot;127.0.0.1&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;(add-to-list &amp;#39;w3m-no-proxy-domains &amp;quot;localhost&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As for me, if I don&#x27;t add this, I can&#x27;t test my blog since I will get
a proxy error. Configure to your actual and specific setup.
Refactoring that, here is a command to add the site as a proxy
exception:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;(defun fn&#x2F;w3m-add-current-host-to-no-proxy-domains ()
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;Add current host to `w3m-no-proxy-domains&amp;#39;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  (interactive)
&lt;&#x2F;span&gt;&lt;span&gt;  (when (eq major-mode &amp;#39;w3m-mode)
&lt;&#x2F;span&gt;&lt;span&gt;    (lexical-let* ((parts (w3m-parse-http-url w3m-current-url))
&lt;&#x2F;span&gt;&lt;span&gt;        (host (elt parts 1)))
&lt;&#x2F;span&gt;&lt;span&gt;      (add-to-list &amp;#39;w3m-no-proxy-domains host t)
&lt;&#x2F;span&gt;&lt;span&gt;      (w3m-reload-this-page))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;auto-start-and-kill&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#auto-start-and-kill&quot; aria-label=&quot;Anchor link for: auto-start-and-kill&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Auto Start And Kill&lt;&#x2F;h2&gt;
&lt;p&gt;When &lt;code&gt;w3m&lt;&#x2F;code&gt; loads, it might be convenient to start it up. However,
these processes is not as simple as &lt;code&gt;flyspell&lt;&#x2F;code&gt; or the like, so asking
permission or confirmation as a reminder might be wise. A simple
snippet does the job:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;(when (yes-or-no-p &amp;quot;Start polipo and tor for w3m? &amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;  (fn&#x2F;w3m-polipo-tor-start-process))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now the flip side of killing it should be handled when Emacs
terminates; however for some reason, &lt;code&gt;tor&lt;&#x2F;code&gt; doesn&#x27;t cleanly stop which
creates a leak that is not visible by &lt;code&gt;list-process&lt;&#x2F;code&gt;. Strangely,
&lt;code&gt;polipo&lt;&#x2F;code&gt; closes properly but &lt;code&gt;tor&lt;&#x2F;code&gt; does not. A stronger guarantee
is to kill it as part of Emacs:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;emacs-lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-emacs-lisp &quot;&gt;&lt;code class=&quot;language-emacs-lisp&quot; data-lang=&quot;emacs-lisp&quot;&gt;&lt;span&gt;(add-hook &amp;#39;kill-emacs-hook #&amp;#39;fn&#x2F;w3m-polipo-tor-kill-process)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This hook is not a true guarantee as Emacs can be killed externally,
so this hook will not run, thus &lt;code&gt;tor&lt;&#x2F;code&gt; is still running after the next
session. You can check using &lt;code&gt;proced&lt;&#x2F;code&gt; if a &lt;code&gt;tor&lt;&#x2F;code&gt; is still running and
kill it accordingly. This is apparently standard behavior for deamons.&lt;&#x2F;p&gt;
&lt;p&gt;When Emacs is killed, it sends a SIGHUP signal to its child processes
or more importantly to the processes made with &lt;code&gt;start-process&lt;&#x2F;code&gt;. As
stated by the manual:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;SIGHUP
&lt;&#x2F;span&gt;&lt;span&gt;The signal instructs Tor to reload its configuration (including closing and reopening
&lt;&#x2F;span&gt;&lt;span&gt;logs), and kill and restart its helper processes if applicable.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This means when Emacs is killed externally, it restarts &lt;code&gt;tor&lt;&#x2F;code&gt; instead
of killing it. Sadly, changing the kill or intercept the signal &lt;code&gt;tor&lt;&#x2F;code&gt;
receives is not easy. For now, this issue is out of scope for a simple
process glue. You can create a custom script to start &lt;code&gt;tor&lt;&#x2F;code&gt;, but this
is a reminder that we can&#x27;t control everything without lower level
work.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;With this, we joined &lt;code&gt;w3m&lt;&#x2F;code&gt;, &lt;code&gt;polipo&lt;&#x2F;code&gt;, &lt;code&gt;tor&lt;&#x2F;code&gt; to browse more privately
and all within Emacs. Not perfect but it gets the job done. There are
features or aspects that can be improved:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Data and argument binding, managing &lt;code&gt;w3m-command-arguments&lt;&#x2F;code&gt; as well&lt;&#x2F;li&gt;
&lt;li&gt;Error handling&lt;&#x2F;li&gt;
&lt;li&gt;Process management on open and close of &lt;code&gt;w3m&lt;&#x2F;code&gt;, maybe &lt;code&gt;prodigy&lt;&#x2F;code&gt;?&lt;&#x2F;li&gt;
&lt;li&gt;Proxy fine-tuning and configuration, checkout &lt;a href=&quot;https:&#x2F;&#x2F;gitweb.torproject.org&#x2F;torbrowser.git&#x2F;plain&#x2F;build-scripts&#x2F;config&#x2F;polipo.conf?id=1ffcd9dafb9dd76c3a29dd686e05a71a95599fb5&quot;&gt;custom polipo conf from tor&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;As disclaimer, this does not fully make you anonymous specially in
cases where you need to login, but it is an improvement over private
browsing.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Dogville - Transparent Morality</title>
          <pubDate>Wed, 01 Feb 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/watcher/dogville-transparent-morality/</link>
          <guid>https://fnlog.dev/watcher/dogville-transparent-morality/</guid>
          <description>&lt;h2 id=&quot;dogville&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dogville&quot; aria-label=&quot;Anchor link for: dogville&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Dogville&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Dogville removes superfluous walls to examine moral actions&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Dogville&quot;&gt;Dogville (2003)&lt;&#x2F;a&gt; is a unique yet difficult film to watch. Aside from
using three hours and nine chapters like Quentin Tarantino&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FHateful%5FEight&quot;&gt;The
Hateful Eight&lt;&#x2F;a&gt;. It presents a town with no walls but only a chalk
outline akin to an architectural blueprint. A town that is bare of
superfluous details such as walls and trees and roads and fence, just
the space where people live.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;dogville-transparent-morality&#x2F;blueprint.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;I like director, &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Lars%5Fvon%5FTrier&quot;&gt;Lars von Trier&lt;&#x2F;a&gt;, and his other work &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Melancholia%5F%25282011%5Ffilm%2529&quot;&gt;Melancholia&lt;&#x2F;a&gt; for
tackling different issues such as depression although his camera work
and visuals are somewhat stagnant. To compensate for the lack of
visuals, it must have a strong story or compelling characters. If you
have seen this and made it through, then it is for you to decide if it
is.&lt;&#x2F;p&gt;
&lt;p&gt;My focal point of dicussion is on the use of the setting and how it
correlates to its message. The message itself is somewhat direct with
a little subversion on tropes so I won&#x27;t discuss that here.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;SPOILER ALERT&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-town-with-no-walls&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#a-town-with-no-walls&quot; aria-label=&quot;Anchor link for: a-town-with-no-walls&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
A Town With No Walls&lt;&#x2F;h2&gt;
&lt;p&gt;The audience can see the town has no walls but the actors are confined
by the space which they live in. This is akin to a stage play where
everything has been stripped to the bare minimum only to focus on the
actors. It is a strange setup indeed for a long and experimental film
but what does it really do? You may say it is a gimick to reduce
setting cost and excuse shoddy cinematography to which I might agree;
however, there is a thematic reason why it is used.&lt;&#x2F;p&gt;
&lt;p&gt;At a face value, this allows the audience to see the actors behind
walls. Obvious but misleading since the camera controls the viewpoint.
The true value of it can be seen from this unseen and horrendous rape
scene:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;dogville-transparent-morality&#x2F;unseen-rape.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The audience sees the sexual assault but not the actors. Not only does
this heighten the devious act, this emphasizes the distance and denial
the towns people have. They are near but cannot or refuses to see what
is next to them. This disonnance between what the audience and actors
sees is what this setup bring.&lt;&#x2F;p&gt;
&lt;p&gt;However, it is not enough to justify it with a scene or two. To give
it meaning, it must be tied to the message or story of the film. The
town spiritual and moral leader is a philosopher, so this films hints
at saying something moral. A critical line from this philosopher is:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;The whole country would be better served with a greater attitude of&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;
&lt;em&gt;&lt;strong&gt;openness and acceptance&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Openness and acceptance. Hipocricy and denial, to be exact. By laying
down the extraneous walls, the town and its people are laid bare for
the audience to examine.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reflection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reflection&quot; aria-label=&quot;Anchor link for: reflection&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Reflection&lt;&#x2F;h2&gt;
&lt;p&gt;After the hardships, hipocricy and cruelty the town has displayed to
Grace, the judgment at the end is well deserved although you could
reason more about it. More importantly, the initial decision to show
mercy yet reconsider wrath instead is very appropriate. Her reasoning
to be a martyr or merciful is hypocritical to what she reasons out,
which the film discusses with little for me to say. The theme of
self-examination runs deep.&lt;&#x2F;p&gt;
&lt;p&gt;The people themselves are deceptive in being kind at first but treat
her harshly later on and deny their abuse and wrongdoing. No one is
innocent specially the philosopher who merely uses words to his own
benefit.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;dogville-transparent-morality&#x2F;cruelty.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;When Grace attempts to leave, no one bothered asking what they did
wrong in why should a person leave their small community. Instead,
they tie her up to a proxy ball-and-chain. This film is hard to watch
because of the treatment and reality of Grace, which might happen to
anyone. A dark interpretation of human morality.&lt;&#x2F;p&gt;
&lt;p&gt;Going back to our setup, aside from the town&#x27;s ironic geographic
emotional size, it reflects how little in the town really matters.
Since majority of the details could be removed even the dog, there is
little to care for about the town and by extension its people.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;dogville-transparent-morality&#x2F;dog.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;In a way, this supports Grace&#x27;s decision to remove this morally
deceitful town. Notice the one that remains after the massacre is the
unknowing and pure dog. It goes a bit more abstract.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;abstraction&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#abstraction&quot; aria-label=&quot;Anchor link for: abstraction&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Abstraction&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;GRACE: Why not just call it Dogville?
&lt;&#x2F;span&gt;&lt;span&gt;TOM: Wouldn&amp;#39;t work. No, it wouldn&amp;#39;t work. It&amp;#39;s got to be universal.
&lt;&#x2F;span&gt;&lt;span&gt;TOM: A lot of writers make that mistake.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, the philospher indicates in naming his realized book to be a
universal name, not theirs furthering the meaning. However, it does
raise the point why the town is called Dogville. By joining the two
lines together, it indicates that the town itself is symbolic of
cruelty and hipocrisy happening anywhere.&lt;&#x2F;p&gt;
&lt;p&gt;So what if we imagine transparent walls around our homes, what would
it look like? Would it be just as Dogville be? If so would, that our
morality and courtesy be only our advantage? This is the literal
meaning of the setup, what is a world without walls? Do we want to see
beyond what our minds allow like bullying, abuse or rape in society?&lt;&#x2F;p&gt;
&lt;p&gt;Honestly as a hipocrite, I do not want to see what beyond the walls.
In that sense, is my morality truly a convenience? In general, is
morality that transparently empty?&lt;&#x2F;p&gt;
&lt;p&gt;Obviously there is more philosophical but this is the message of the
film. So in my opinion, the use of transparent walls was used to good
effect. A unique setup that I won&#x27;t probably see in a long time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The film is pretty straightforward in its meaning although long and
chatty. If you can stomach it, I encourage you to watch this gut
wrenching film for its unique story and depiction of morality. As for
me, it is one of my new favorite film that I cannot rewatch without
effort.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A DSL For Git And Projectile Ignore File</title>
          <pubDate>Wed, 25 Jan 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/a-dsl-for-git-and-projectile-ignore-file/</link>
          <guid>https://fnlog.dev/dev/a-dsl-for-git-and-projectile-ignore-file/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;After writing some &lt;a href=&quot;https:&#x2F;&#x2F;duckduckgo.com&#x2F;l&#x2F;?kh=-1&amp;amp;uddg=https%253A%252F%252Fgithub.com%252Fbbatsov%252Fprojectile&quot;&gt;projectile&lt;&#x2F;a&gt; glue and &lt;code&gt;.projectile&lt;&#x2F;code&gt; and &lt;code&gt;.gitignore&lt;&#x2F;code&gt;
files, I thought to myself if I could write code to generate those
files. A DSL so to say. The reason is three-fold:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Write a simple ignore file structure as Elisp code&lt;&#x2F;li&gt;
&lt;li&gt;Allow Elisp variables for dynamic and reusable sections&lt;&#x2F;li&gt;
&lt;li&gt;Have a hand in writing a generic DSL&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Aside from my hacking sensibilities, the key concerns of doing so may
be put as:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Maintaining two ignore files when it is just really one with a
different syntax&lt;&#x2F;li&gt;
&lt;li&gt;You cannot reuse blocks of repeating sections with different files&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The former is syntactic separation while the later is flexibility and
reusability. For my use case with Elisp, I have two projects: my Emacs
configuration and my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;org-jekyll-blogger.el&quot;&gt;org-jekyll-blogger.el&lt;&#x2F;a&gt; blog project. Using &lt;code&gt;git&lt;&#x2F;code&gt;
and &lt;code&gt;projectile&lt;&#x2F;code&gt;, I have to more or less copy my ignore files and
tweak it a bit. To address this, I created my own DSL &lt;code&gt;magin&lt;&#x2F;code&gt; to
handle &lt;code&gt;.gitignore&lt;&#x2F;code&gt; files; &lt;code&gt;.projectile&lt;&#x2F;code&gt; is similar in intent but
&lt;code&gt;magin&lt;&#x2F;code&gt; was the library I had in mind as proof.&lt;&#x2F;p&gt;
&lt;p&gt;As an example, this is my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;.emacs.d&quot;&gt;.emacs.d&lt;&#x2F;a&gt; &lt;code&gt;.gitignore&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-text &quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span&gt;# Base files
&lt;&#x2F;span&gt;&lt;span&gt;config.el
&lt;&#x2F;span&gt;&lt;span&gt;personal.el
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Base directory
&lt;&#x2F;span&gt;&lt;span&gt;.cache
&lt;&#x2F;span&gt;&lt;span&gt;extra
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Project specific
&lt;&#x2F;span&gt;&lt;span&gt;working-config.org
&lt;&#x2F;span&gt;&lt;span&gt;my-macros.el
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Library
&lt;&#x2F;span&gt;&lt;span&gt;lib&#x2F;sandbox
&lt;&#x2F;span&gt;&lt;span&gt;lib&#x2F;packages
&lt;&#x2F;span&gt;&lt;span&gt;!lib&#x2F;modules
&lt;&#x2F;span&gt;&lt;span&gt;!lib&#x2F;scripts
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Block for gtags
&lt;&#x2F;span&gt;&lt;span&gt;GPATH
&lt;&#x2F;span&gt;&lt;span&gt;GTAGS
&lt;&#x2F;span&gt;&lt;span&gt;GRTAGS
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;# Block for emacs
&lt;&#x2F;span&gt;&lt;span&gt;*.elc
&lt;&#x2F;span&gt;&lt;span&gt;.#*
&lt;&#x2F;span&gt;&lt;span&gt;*Org Src*
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It is generated by this DSL:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;delimited &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Context keyword that separates contexts by newlines
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Represents a semantic group
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comment &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Base files&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A comment keyword
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file ,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s.el&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;base fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;config&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A file keyword
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file ,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s.el&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;base fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;personal&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Notice I use a Elisp variable
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comment &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Base directory&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Generates &amp;quot;# Base directory&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.cache&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A dir keyword
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; An alias to file but it indicates intends for a directory
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comment &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Project specific&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;working-config.org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file  ,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s.el&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;base fmk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;macro&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comment &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Library&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Represents a path prefix
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Everything underneath is generated with a &amp;quot;lib&amp;quot; prefix
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;sandbox&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;packages&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;include
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;modules&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;scripts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; gtags&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Reusable blocks
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; emacs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; user&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emacs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;directory &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Rewrites =.gitginore= of `user-emacs-directory&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I do hope the DSL is easy to digest. Here are the two libraries for
the interested: &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;e5b667a8640ba1052138ac9ec5d50ed4&quot;&gt;magin&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;82a3440565a6794327ed74685ba9902f&quot;&gt;projin&lt;&#x2F;a&gt;. If you stay around, I&#x27;d like to
discuss the following concepts in crafting it:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Backquote&lt;&#x2F;li&gt;
&lt;li&gt;Dispatching&lt;&#x2F;li&gt;
&lt;li&gt;Implicit Environment&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;backquoting&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#backquoting&quot; aria-label=&quot;Anchor link for: backquoting&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Backquoting&lt;&#x2F;h2&gt;
&lt;p&gt;The reason why I was confident in making this DSL is due to thanks to
&lt;a href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&#x2F;manual&#x2F;html%5Fnode&#x2F;elisp&#x2F;Backquote.html&quot;&gt;backquoting&lt;&#x2F;a&gt;: it mixes the use of quoting and expressions in a Lispy
way. I point you to understand &lt;a href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&#x2F;manual&#x2F;html%5Fnode&#x2F;elisp&#x2F;Quoting.html&quot;&gt;quoting&lt;&#x2F;a&gt; before proceeding, but as a
quick brush it is using list of symbols as data.&lt;&#x2F;p&gt;
&lt;p&gt;As an example of quoting:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2 3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; 6
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2 3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (+ 1 2 3)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quote &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; 3e&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;subject linking&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;verb adjective&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Missing symbols
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;subject linking&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;verb adjective&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; As is
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It also allows for lazy evaluation, the problem arises when we want to
integrate Elisp variables into the equation:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq left &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   right &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; 3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; 3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (+ 1 right)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Using backquotes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ,right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (+ 1 2)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (+ 1 3)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Evaluating the actual value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; left right&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; 4
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The complicated approach would ask us to create a tokenizer, parser
and compiler while managing text matching and all that jazz; lispy
data structures allows us to bypass this through the quoting. Without
needing anymore, we can create a quoted structures that integrates
with Elisp without any hastle.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;domain-syntax&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#domain-syntax&quot; aria-label=&quot;Anchor link for: domain-syntax&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Domain Syntax&lt;&#x2F;h2&gt;
&lt;p&gt;So in thinking of the DSL, let us understand what the domain is. Our
domain of abstraction is &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;gitignore&quot;&gt;gitignore&lt;&#x2F;a&gt;. After some thinking and reading,
this is the abstraction I want to address:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Files and directories have no distinction&lt;&#x2F;li&gt;
&lt;li&gt;Comments&lt;&#x2F;li&gt;
&lt;li&gt;Path context&lt;&#x2F;li&gt;
&lt;li&gt;Separators&lt;&#x2F;li&gt;
&lt;li&gt;Inclusion&lt;&#x2F;li&gt;
&lt;li&gt;Reusable blocks or groups&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There are other such abstraction I wish not cover:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Quoting or escaping&lt;&#x2F;li&gt;
&lt;li&gt;Glob keywords, as in &lt;code&gt;rx.el&lt;&#x2F;code&gt;, for single or double asterisk&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;A DSL that is good enough to accomplish the above is good enough
without being too abstract. Without stretching too much, this DSL has
no intermediate output, it translates directly to text. This tradeoff
loses flexibility in output but at least it is easier. If you wanted,
the DSL can be mechanically a list of plists with a main text
manipulated by several properties as such:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compiler
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;glob&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;include
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;foo.bar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;gib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;foo-bar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; This hypothetically might yield
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:line &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;foo.bar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :include &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :parent &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;glob&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:line &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;foo-bar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :include &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :parent &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;glob&#x2F;gib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Without much complexity aside, we can start with hacking with the
simple syntax.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;keywords&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#keywords&quot; aria-label=&quot;Anchor link for: keywords&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Keywords&lt;&#x2F;h2&gt;
&lt;p&gt;At last, we define our data structure:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; The leaf keywords
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file ,line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir ,line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Alias for file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Non functional nodes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comment ,text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;newline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Syntactic grouping, the equivalent of progn
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context &amp;amp;rest ,sublines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Contextual grouping, like `context&amp;#39; but affects everything inside it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Sublines have the property `:include&amp;#39; as `t&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Which tells the leaf node to add `!&amp;#39; as a prefix
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;include &amp;amp;rest ,sublines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Sublines have the property `:path&amp;#39; set to `path&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Nesting of paths are handled
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path ,path &amp;amp;rest sublines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Block keywords
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Create a variable
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defblock ,&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &amp;amp;rest &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Call the variable
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ,&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Aesthetic grouping
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Every subline is interleaved with a newline
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;delimited &amp;amp;rest ,sublines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Those are the keywords that we must handle in our DSL. With this in
mind, we can start be creating a function that handles the
compilation.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin--compiler &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsl &amp;amp;optional env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Compiles DSL with the environment ENV.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is our DSL handler, every node that wants to compile nodes have
to go through this dispatching function. This setup allows us to add
more keywords independently of each other. However, we are not going
to use a long &lt;code&gt;switch&lt;&#x2F;code&gt; or &lt;code&gt;cond&lt;&#x2F;code&gt; statement; we will use the implicit
Elisp environment to find handlers. If the compiler comes to a
keyword, it finds a function in the Elisp environment that starts with
&lt;code&gt;magit--dsl-&lt;&#x2F;code&gt; and invokes that as a handler.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin--dsl-context &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsl env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;File keyword handler.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin--dsl-file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsl env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;File keyword handler.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin--dsl-block &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsl env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Block keyword handler.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compiler
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; emacs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unknown&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Error, no `magit--dsl-unknown&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the example above, the compiler finds the three functions above and
calls them but fails on the last one. So if you want to extend it
without messing with the source, one can simply define a function with
the prefix and it will be detected by the compiler. This is similar to
how &lt;code&gt;use-package&lt;&#x2F;code&gt; does it with its keywords. A global dependency
injection if you will. This magic is done through &lt;code&gt;intern-soft&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rule&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-name rule&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rule&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handler
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;intern&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;soft
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s%s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prefix rule&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;null&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rule&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handler&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;No rule to handle %s at dsl: %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; rule&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name dsl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall rule&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;handler dsl env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As a side note, you can use an &lt;code&gt;hash-map&lt;&#x2F;code&gt; or create your own &lt;code&gt;obarray&lt;&#x2F;code&gt;
or symbol environemt if you really wanted a private space. In our
approach, you can see the symbols with the helpful &lt;code&gt;describe-variable&lt;&#x2F;code&gt;
without extra work.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to use &lt;code&gt;eval-sexp&lt;&#x2F;code&gt; with the raw DSL, you have to create
your own &lt;code&gt;eval&lt;&#x2F;code&gt; and &lt;code&gt;env&lt;&#x2F;code&gt;. You can remap &lt;code&gt;eval&lt;&#x2F;code&gt; with &lt;code&gt;magin-compiler&lt;&#x2F;code&gt;,
but you need to know when it is evaluating a DSL or a Lisp. We&#x27;re not
creating a new interpreter or environment, so this is good enough.&lt;&#x2F;p&gt;
&lt;p&gt;With this simple mechanism, we can define the keywords incrementally.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;context-keyword&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#context-keyword&quot; aria-label=&quot;Anchor link for: context-keyword&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Context Keyword&lt;&#x2F;h2&gt;
&lt;p&gt;So our dispatcher is a function that takes a dsl and an environment
which returns a text. Without the intermediate data structure, the
context is applying the dispatcher to each line and then combining it
with a newline delimiter as such:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;subdsl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;magin--compiler&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; subdsl env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; subdsls&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is simply lining up the entries. Nothing complicated but how
about manipulating those that manipulate the environment?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;environmental-keyword&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#environmental-keyword&quot; aria-label=&quot;Anchor link for: environmental-keyword&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Environmental Keyword&lt;&#x2F;h2&gt;
&lt;p&gt;A quick way to create an environment like scoping, one can easily use
an alist and it will take care of itself. For example with the
&lt;code&gt;include&lt;&#x2F;code&gt; keyword:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;env &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;append &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons :include &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context dsl new&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You could use plist but have to implement an &lt;code&gt;extend&lt;&#x2F;code&gt; function for it.
Interestingly, you could also use an alist to simulate an enviroment
and lexical scoping without much problem.&lt;&#x2F;p&gt;
&lt;p&gt;It is as simple as appending the &lt;code&gt;cons&lt;&#x2F;code&gt; entry and it is done. The
others are implemented the same way. Now how about implementing the
leaf keywords&lt;&#x2F;p&gt;
&lt;h2 id=&quot;leaf-keyword&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#leaf-keyword&quot; aria-label=&quot;Anchor link for: leaf-keyword&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Leaf Keyword&lt;&#x2F;h2&gt;
&lt;p&gt;The implementation above forces everything to the leaf node which
really have only one important one, &lt;code&gt;file&lt;&#x2F;code&gt;. The file has to take the
text value and format it based on the environment.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parent &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;assoc :parent env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;include &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;assoc :include env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat include parent file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Our friend is &lt;code&gt;assoc&lt;&#x2F;code&gt; and &lt;code&gt;cdr&lt;&#x2F;code&gt; when manipulating an alist enviroment.
Again, it is simply a matter formatting. So writing a DSL with this
setup is actually easy.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;block-keyword&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#block-keyword&quot; aria-label=&quot;Anchor link for: block-keyword&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Block Keyword&lt;&#x2F;h2&gt;
&lt;p&gt;Lastly, let&#x27;s talk about defining a block variable. Like with the
dispatcher, we can use the implicit Elisp environment as the variable
space. No need to define a hash of symbols and lookups, we already
have one and we take advantage of it. The keyword &lt;code&gt;defblock&lt;&#x2F;code&gt; will
simply save the defintion into a symbol with a &lt;code&gt;magin--block-&lt;&#x2F;code&gt; prefix
and the other one, &lt;code&gt;block&lt;&#x2F;code&gt;, looks for it. Aside from &lt;code&gt;intern-soft&lt;&#x2F;code&gt;,
the complimentary friend is &lt;code&gt;makunbound&lt;&#x2F;code&gt;, which unbinds the symbol so
the value is updated properly.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-name &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;intern
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s%s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prefix
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;makunbound &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eval `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar ,&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context ,@&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           ,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Block definition for %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;block-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from using some direct &lt;code&gt;eval&lt;&#x2F;code&gt; magic, it is as straightforward as
it gets as well as with the &lt;code&gt;block&lt;&#x2F;code&gt; handler. With this, we can have
our resusable blocks of code.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defblock
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defblock emacs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comment &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Block for emacs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;*.elc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.#*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;*Org Src*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Org Src buffers
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;non-functional-keyword&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#non-functional-keyword&quot; aria-label=&quot;Anchor link for: non-functional-keyword&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Non-functional Keyword&lt;&#x2F;h2&gt;
&lt;p&gt;The least important is the non-functional ones, like with &lt;code&gt;comment&lt;&#x2F;code&gt;
and &lt;code&gt;newline&lt;&#x2F;code&gt; which are prefixed text and an empty text respectively.
However, the &lt;code&gt;delimited&lt;&#x2F;code&gt; keyword is a bit more complex that it
interleaves each line with a &lt;code&gt;newline&lt;&#x2F;code&gt; keyword.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;delimited&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsls
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;append
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;newline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; dsl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          subdsls&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compiler
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     ,@delimited&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dsls&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   env&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Take your pick in implementing &lt;code&gt;interleave&lt;&#x2F;code&gt; but the thing here is that
it wraps the old context with a newly modified one. It may not be a
big thing but this interferes with debugging and tracing when you
don&#x27;t know the original source. This is one weakness of this approach
that it interferes with the dsl itself. Nothing terrible but it is the
price of having the return value as text instead of an intermediate
value.&lt;&#x2F;p&gt;
&lt;p&gt;With all those ideas, the DSL is easily implemented.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#wrap-up&quot; aria-label=&quot;Anchor link for: wrap-up&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Wrap Up&lt;&#x2F;h2&gt;
&lt;p&gt;So with this design and implementation we have a crud but simple and
dynamic DSL. You can look at the main defintion and notice the use of
backquoting in how it addresses the problems mentioned. Now I can
manage my ignore file with Emacs.&lt;&#x2F;p&gt;
&lt;p&gt;Now for some minor things we might have forgotten:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Unit tests&lt;&#x2F;li&gt;
&lt;li&gt;Logging&lt;&#x2F;li&gt;
&lt;li&gt;Debugging&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The DSL is not too complex to warrant any of those but it is nice to
note and implement. As one final point, we could have used a
&lt;code&gt;defmacro&lt;&#x2F;code&gt; instead of a dispatch compiler but in case we want to
update our code in order to join other contexts, we have a base.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq left&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;code `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   right&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;code `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;context
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magin&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join left&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;code right&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;code&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ???
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If we are dealing with text, we can&#x27;t have this yet. In particular if
you have an initial defintion and want to update it according some
condition, then it requires changing the code to handle plist or
something that fancies the data.&lt;&#x2F;p&gt;
&lt;p&gt;To reiterate, Elisp allows us to create a DSL with ease and little
knowledge.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;So I copied this code to create &lt;code&gt;projin&lt;&#x2F;code&gt; for &lt;code&gt;projectile&lt;&#x2F;code&gt; ignore file
but unless I need more functionality, I don&#x27;t think I need it for now.
If another ignore file comes my way, I might refactor and do the same.&lt;&#x2F;p&gt;
&lt;p&gt;The one thing I want to really write is a DSL for SQL writing, not SQL
itself. My dream is to write SQL as blocks of data.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fields &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fields first&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name last&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name middle&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;select
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fields
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; table&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; &amp;quot;SELECT firstName, lastName, middleName FROM table&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The idea in that snippet is the fields are data itself. It also
extends to queries being data but the abstraction of aliasing and
joining is sketchy for now. That is my dream though: to write a DSL
for SQL writing. For now, ignore files are good practice.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The Garden of Words - Maturity And Responsibility</title>
          <pubDate>Wed, 25 Jan 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/watcher/the-garden-of-words-maturity-and-responsibility/</link>
          <guid>https://fnlog.dev/watcher/the-garden-of-words-maturity-and-responsibility/</guid>
          <description>&lt;h2 id=&quot;the-garden-of-words&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-garden-of-words&quot; aria-label=&quot;Anchor link for: the-garden-of-words&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Garden of Words&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;A faint clap of thunder, Clouded skies, Perhaps rain will
come. If so, will you stay here with me?&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FGarden%5Fof%5FWords&quot;&gt;The Garden of Words (2013)&lt;&#x2F;a&gt; for me is the second best in my list for
Shinkai. After rewatching it and found it deeper than I thought it
would be, I want to talk about this visually beautiful film. Aside
from being emotionally and romantically moving, I want to talk about
another aspect of there relationship namely the themes of maturity and
responsibility.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;SPOILER WARNING&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;NOTE: Screenshots have reduced quality since they are too pretty to&lt;&#x2F;strong&gt;
&lt;strong&gt;load fast. That&#x27;s how pretty and defined the film&#x27;s frames are.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;place-and-time&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#place-and-time&quot; aria-label=&quot;Anchor link for: place-and-time&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Place And Time&lt;&#x2F;h2&gt;
&lt;p&gt;In order to discuss the relationship between our characters, let&#x27;s
discuss the mechanics of it. During rainy morning, each of our
characters retreat to a tiny hut in a park where they accidentally and
coincidentally meet and do so every rainy day.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;the-tree-and-the-twig.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Neither revealing who they really are and being in their own little
solitude, both warm up to there shared isolation over time. This is a
quiet and beautiful setup that I rarely see in films. A genre savvy
person would cue this is as an opportunity to have a blooming
relationship in an isolated environment where meeting outside this
shelter is a plot revelation.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from being in their own world, the rain also plays quite a
symbolic meaning here. The rain serves as a veil to the world they are
escaping, the city noise muffled by the falling rain. This veil
obscures the world to focus on them and their internal silence. It
also serves as the extent of there initial relationship. Shrouded by a
veil of escapism, neither revealing who they are outside, only what
they wish to show inside. During their meetings under the shower, they
are hidden and hiding themselves. Quite a poetic tone this setup
yields.&lt;&#x2F;p&gt;
&lt;p&gt;Another way to look at this setup is where people can be people
without there social standing and responsibility. Our characters only
know what the dressing means but they come bare without the chatter
and stigma of it. Weary adults and youth, they can come here with
their naked silence and weakness. A student and an office worker and
nothing more and this is what the film settles on. Both skipping work
and neither judge each other and talk about it. So they can go on
without knowing there names or lives. This is what this place is, a
place where solitude and privacy is respected.&lt;&#x2F;p&gt;
&lt;p&gt;There is an asymmetry here that break the characters contracts. During
their first meeting, the older woman recites a Japanese poem which I
find very poignant and at the same time a hint on who she is. It
implies she knows where the student goes and say something that the
school might know. However, the student does not pick up on this
subtle hint and they continue in their shared space.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;a-shared-space.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;h2 id=&quot;characters&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#characters&quot; aria-label=&quot;Anchor link for: characters&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Characters&lt;&#x2F;h2&gt;
&lt;p&gt;A high-school student and a working woman. I understand if people find
this a strange combination of a romantic relationship between an older
woman a decade older than the man, but the context of their
relationship should be examined. The examination I would like to focus
on who is the child and adult.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-child&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-child&quot; aria-label=&quot;Anchor link for: the-child&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Child&lt;&#x2F;h3&gt;
&lt;p&gt;Takao, the high schooler.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;the-child.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;What makes him standout is that he is mature for his age: he does the
cooking, he gets jobs to pay for his tuition, he has a dream that he
is working on. Despite being a student, he is pretty mature in taking
household and personal responsibility aside from skipping school on
rainy mornings.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-adult&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-adult&quot; aria-label=&quot;Anchor link for: the-adult&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Adult&lt;&#x2F;h3&gt;
&lt;p&gt;Yukino, the literature teacher.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;the-adult.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Although it is sad she is bullied by her students, she does not work
for a while and decides to go to the park on rainy mornings. She does
not know how to cook so she brings chocolates, where sweets are
indicative of being childish. She drinks beer early morning as if to
lull the day away. Ignoring responsibility, she is not a mature role
model despite being a teacher.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;conflict&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conflict&quot; aria-label=&quot;Anchor link for: conflict&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conflict&lt;&#x2F;h3&gt;
&lt;p&gt;Symbolically, Takao is the adult while Yukino is the child while
physically it is the opposite. Here is where opposites attract.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;the-roles.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;In the scene where Takao measures Yukino&#x27;s foot, I find it beautiful
and subtle. To contextualize, Yukino gives Takao a shoe design book
which is somewhat the closest thing she has done in being a teacher
by giving him a book that he cannot afford. To repay that kindness,
Takao offers to make Yukino a shoe for her, handcrafting to show its
personal and priceless value. This simple exchange shows their
interest in each others space and world.&lt;&#x2F;p&gt;
&lt;p&gt;Takao wants to be treated as an adult, going to school on a sunny day
illuminates and reminds him of the fact that he is not. Granted that
he is surprisingly independent, but the fact that he wants to be
acknowledged as such shows he is not really one yet. One does need to
tell everyone who they are to be who they really are. Weirdly, he
thrust into this independence partly because his mother is gone
hunting men or for the lack of a parental figure. The reason why he
wants to be a shoe maker is presented in a way to please her mother
and carried this dream or idea through his teenage years. By making
shoes, will it give him the attention his mother had once given the
shoe? Regardless, the presence of the mysterious adult Yukino allows
him to connect to the world he wants as well fulfill this dream or
desire to be noticed.&lt;&#x2F;p&gt;
&lt;p&gt;On the other hand, Yukino is emotionally crippled by the people she
is helping. For no fault of her own, one of her student falls for her
but the girlfriend of this student started spreading rumors which
caused the class to harass her. One subtle thing I had a hard time
picking up is whether Yukino was in a relationship with another
teacher, Itou, who broke up with her because he believed the rumors
and dissuaded her in taking action since it might affect the school
they are working on; if that is the case, she has no one to
understand her. Either way by being seen as an adult and teacher, she
cannot truly show this weakness and do her job since by not being
emotionally reconciled and repressed she cannot effectively teach
children how to be a strong adult and not a crybaby. So by being with
a student that does not know her, her crippling isolation is slowly
melting away by finding acceptance in him.&lt;&#x2F;p&gt;
&lt;p&gt;You can say Yukino is indeed acting weak or immaturely but that is
the point with her. Despite growing in years, it does not mean she
grows emotionally on par. People are not invulnerable and get hurt,
children and adults.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;the-fallen-shoe.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;So the nature and resolution of their conflicts and coincide with
their communion. Their prayer for rain is really a heartfelt one so
the response to the poem seem to suggest the answer:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Even if rain comes not, I will stay here, together with you.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;equal-footing&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#equal-footing&quot; aria-label=&quot;Anchor link for: equal-footing&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Equal Footing&lt;&#x2F;h2&gt;
&lt;p&gt;The film uses walking here to symbolize the struggle with life and
shoes the support and strength needed to continue with it. Rightly so,
shoes are made for walking and to protect the feet from stones and harm.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;forgetting-how-to-walk.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;In line with responsibility, the thing I want to point out here is
social status and footing. The phrase &amp;quot;on equal footing&amp;quot; holds weight
here as it describes the relationship and catharsis for our
characters. So the scene where Takao confesses to Yukino has so much
meaning to address.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;their-relationship-outside&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#their-relationship-outside&quot; aria-label=&quot;Anchor link for: their-relationship-outside&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Their Relationship Outside&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;the-happiest-time.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;After meeting on a sunny day, a storm suddenly switches on which
leads our characters to experience their relationship outside of it.
I genuinely felt moved by the simple, short and quiet scene which
shows what they had in their paradise remains true and valid even if
all of it was a mystery and front. As it pains me to say this, their
relationship has completed their conflict in terms of walking in life.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;walking-in-the-sunny-season&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#walking-in-the-sunny-season&quot; aria-label=&quot;Anchor link for: walking-in-the-sunny-season&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Walking In The Sunny Season&lt;&#x2F;h3&gt;
&lt;p&gt;Once the rainy season had stopped, both characters cannot and will
not go to their promised place because they had no reason. It looks
cute that way but the clever use of light and rain indicates that
there meeting is a dream made by rain and not just a time and place.
So there relationship is in a hiatus but they move in their lives.&lt;&#x2F;p&gt;
&lt;p&gt;Yukino decides during this period to move to another teaching job and
Takao gets jobs to pay for his tuition and the shoe materials.
Neither would have happened if they never shared their company. So
when they met outside for the first time, they had already decided to
walk.&lt;&#x2F;p&gt;
&lt;p&gt;This is why the confession seems subtly heartbreaking.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;rejection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rejection&quot; aria-label=&quot;Anchor link for: rejection&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Rejection&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;sitting-rejection.png&quot; alt=&quot;&quot; &#x2F;&gt; &amp;amp;nbsp&lt;&#x2F;p&gt;
&lt;p&gt;When Takao confesses to Yukino, she is standing up and he is sitting
down. Yukino then responds by saying to call her with her honorifics
or the respect her status brings. She then sits downs and thanks him
for essentially nothing by stressing the line.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;I was practicing how to walk on my own, there in that place.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;
&lt;em&gt;&lt;strong&gt;Even if am barefoot...&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This line means that she was doing fine without Takao and their
relationship effectively has no bearing on their own walks. Moreover,
there relationship before this was unclouded and unburdened by social
responsibility and status, by demanding the honorifics it breaks the
contract of their relationship. The point here is that Takao is now
seen as a child with an infatuation for a woman a decade older than
him.&lt;&#x2F;p&gt;
&lt;p&gt;Notice the act of Yukino sitting down is similar to talking down a
child and that when she does sit, they do not meet eye to eye as the
division on the door divides it. Here is where Takao&#x27;s age and status
is a hindrance which he escapes in the park. As the kid, he loses out
in the end as he takes his leave.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;acceptance&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#acceptance&quot; aria-label=&quot;Anchor link for: acceptance&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Acceptance&lt;&#x2F;h3&gt;
&lt;p&gt;The cathartic scene where Yukino chases after Takao reiterates this
emotion and the meaning of their footing, status, or the weight of who they
really are.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;uneven-footing.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;All Takao wanted was to be seen as a man or adult. In his eyes,
everything was tipped against him. Yukino knowing more about him and
not telling him she was a teacher at his school is indeed unfair as
it looks like she was playing around with him. It is really unfair
the adult gets the stick or prod.&lt;&#x2F;p&gt;
&lt;p&gt;So when Yukino steps down to embrace Takao, their status are
discarded to reveal that indeed she seems him as something more. They
do no meet halfway, they meet as people. Let the tears flows.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;equals.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The next question is how does this fit in with their ending?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;open-ended-maturity&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#open-ended-maturity&quot; aria-label=&quot;Anchor link for: open-ended-maturity&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Open Ended Maturity&lt;&#x2F;h2&gt;
&lt;p&gt;Yukino finally starts teaching again and Takao finishes the shoes. At
the end of the film, Takao goes to the park on a snowy and leaves the
shoes behind leaving their relationship as open-ended. Here is why I
like the ending better is that the answer to it implies message to the
whole story. To interpret the ending let us answer the meaning of
Yukino leaving.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;the-garden-of-words-maturity-and-responsibility&#x2F;snowy-ending.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;h3 id=&quot;accepting-their-reality&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#accepting-their-reality&quot; aria-label=&quot;Anchor link for: accepting-their-reality&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Accepting Their Reality&lt;&#x2F;h3&gt;
&lt;p&gt;Simply if Yukino stays, she denies her actions in moving. In one way,
she denies who she is just because she loves someone, which would
undermine her reformed strength. She has a responsibility to herself
to carry on and to Takao who is a child still. If their reality is to
be considered, their relationship is inappropriate. Age, social,
economical or whatever reason it might be, it would be wise if both
parties mature further before doing so. This is emphasized by Takao
with the parting lines:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;I was practicing how to walk too. That&#x27;s what I think now.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;
&lt;em&gt;&lt;strong&gt;One day, when I  can walk much farther on my own...&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;
&lt;em&gt;&lt;strong&gt;I&#x27;ll go see her.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Takao is indeed still a child and needs to walk and grow. This
realization settles his path to maturity, that he need not hurry. By
leaving the shoe, he shows resolve instead of waiting for her. So
Yukino has finally acted like a responsible adult.&lt;&#x2F;p&gt;
&lt;p&gt;What I pointed is out the coming to age theme of the film. Others
have done like1 &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;FLCL&quot;&gt;FLCL&lt;&#x2F;a&gt;, but this does it coming from a teenagers point
of view where it might hold better weight and perspective. I
appreciate this portrayal of a teenager, it could have been about
their romantic expressions or moments but I am thankful it was about
their genuine need from each other. However, this does not answer
what it means if they do hook up in the future.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;meeting-up&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#meeting-up&quot; aria-label=&quot;Anchor link for: meeting-up&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Meeting Up&lt;&#x2F;h3&gt;
&lt;p&gt;At this point, it is up to the reader&#x27;s interpretation on the
following points or ideas whether they should meetup. The guiding
principle is interpreting it in the context of a mature relationship.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The woman is years older&lt;&#x2F;strong&gt;
: It is typical or preferable for the man to be older than the
woman if fertility is a question.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Takao shoemaking&lt;&#x2F;strong&gt;
: His desire to make shoes comes from a childish idea. Would you
consider his love for shoe making genuine or but a fad as his
brother puts it? Would you consider leaving the shoes behind as
leaving this idea behind?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;There relationship comes from a veil&lt;&#x2F;strong&gt;
: Is it wise to have a relationship that does not truly know each
other? I&#x27;m assuming Yukino left after their catharsis, so he
still might know nothing about her. By that logic, their
relationship might just be still at surface level. Should he
really chase her then?&lt;&#x2F;p&gt;
&lt;p&gt;Some might say love conquers all or some might say it is just a
phase. Whatever you answer to the main question, it really reflects
on the theme of maturity in their relationship. As for me, I&#x27;m okay
if Takao forgets Yukino because their veiled relationship has done
its work. Whether he decides to find her or not in time, we may never
know.&lt;&#x2F;p&gt;
&lt;p&gt;But isn&#x27;t that love, a dream and a reality?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Dreamer or not, this short film is thought-provoking so much about
teenage maturity and responsibility despite being a love story. That
is why I find this second only to &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;5%5FCentimeters%5FPer%5FSecond&quot;&gt;5 Centimeters Per Second&lt;&#x2F;a&gt; in terms of
exploring aspects of relationships. This film is not perfect that
these points might be too subtle, the open ending, the overly
emotional ending, and so much more but I truly love this film and what
it leaves behind.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Convert Org-Table To YAML For Jekyll</title>
          <pubDate>Wed, 18 Jan 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/convert-org-table-to-yaml-for-jekyll/</link>
          <guid>https://fnlog.dev/dev/convert-org-table-to-yaml-for-jekyll/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;So in making the page for my watch list for the other watcher blog, I
have to convert my unofficial list in Org-Table format to a YAML
format. There are other default formats such as CSV that Jekyll reads
but in keeping with the spirit, I opt to do it as such. The sad thing
about this though is that &lt;strong&gt;there is no YAML exporter for
org-table-export&lt;&#x2F;strong&gt;, so I made my own. Here is the &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;3fcc4452ce9714f2d3a6f81ac0cd7ccd&quot;&gt;snippet&lt;&#x2F;a&gt; to do and a
demonstration.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;convert-org-table-to-yaml-for-jekyll&#x2F;screencast.gif&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;And to use it, you point the mark at a table and use
&lt;code&gt;org-table-export&lt;&#x2F;code&gt; and at the format selection you type
&lt;code&gt;fn&#x2F;orgtbl-to-yaml&lt;&#x2F;code&gt;. With Jekyll, you have to export it to your &lt;code&gt;_data&lt;&#x2F;code&gt;
Jekyll directory to work as stated by the &lt;a href=&quot;https:&#x2F;&#x2F;jekyllrb.com&#x2F;docs&#x2F;datafiles&#x2F;&quot;&gt;manual&lt;&#x2F;a&gt;. But of course, we
are here to explore further to what it means.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;org-table-export&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#org-table-export&quot; aria-label=&quot;Anchor link for: org-table-export&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Org-Table Export&lt;&#x2F;h2&gt;
&lt;p&gt;Initially, I thought I had to create a table parser and transformer
but there is usually a command or function that does what you want
albeit with a little tweaking. The command &lt;code&gt;org-table-export&lt;&#x2F;code&gt; is our
friend here but it is lacking when presented with the format: CSV,
TSV, HTML, LaTeX and others but not YAML. One thing to look at where
this option comes from is &lt;code&gt;org-export-backends&lt;&#x2F;code&gt; but might be overkill
to configure. As an caveat, if you add a backend to it you need to
run this script.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;progn
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;registered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backends
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;remove&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-if-not
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backend&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backend&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name backend&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memq name val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;catch &amp;#39;parentp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;dolist &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;b val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;derived&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backend&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p b name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;throw &amp;#39;parentp &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;registered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backends&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;org-export-backend-name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;registered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backends&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;dolist &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backend val&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;cond
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;load &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ox-%s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; backend&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Problems while trying to load export back-end `%s&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 backend&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;memq backend new&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push backend new&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;default &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backends new&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Something simple would be better for our cause. Is crafting a custom
exporter instead an option? Thankfully, the manual tells us how to
create a simple custom exporter according to this &lt;a href=&quot;http:&#x2F;&#x2F;orgmode.org&#x2F;manual&#x2F;Translator-functions.html#Translator-functions&quot;&gt;link&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;orgtbl-to-language &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table params&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Convert the orgtbl-mode TABLE to language.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;orgtbl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;generic
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   table
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;combine&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plists
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:tstart &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;!BTBL!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :tend &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;!ETBL!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :lstart &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;!BL!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :lend &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;!EL!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :sep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    params&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After reading the documentation, we are interested in two properties:
&lt;code&gt;:skip&lt;&#x2F;code&gt; and &lt;code&gt;:lfmt&lt;&#x2F;code&gt;. The later is more important which controls how a
line is formatted. It accepts a function which takes a list of row
values and returns the record line it represents. Using it as
function, the first value are the row headers and the remaining row
values. We mainly want to focus the function on the value so that is
why have &lt;code&gt;:skip&lt;&#x2F;code&gt; to ignore the first header row. Aside from that, we
can craft our row formatter.&lt;&#x2F;p&gt;
&lt;p&gt;Since this is YAML, our record line is a bit more complex. Each record
starts with a dash and space, ends with a newline, separated by a
newline and two spaces for alignment. Each value must be in a &lt;code&gt;&amp;lt;key&amp;gt;: &amp;lt;value&amp;gt;&lt;&#x2F;code&gt; format and escaped by &lt;code&gt;&amp;quot;&lt;&#x2F;code&gt;. With a sample data, it would look
something like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;org&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-org &quot;&gt;&lt;code class=&quot;language-org&quot; data-lang=&quot;org&quot;&gt;&lt;span&gt;- id: &amp;quot;1&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  name: &amp;quot;Muffin&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  description: &amp;quot;Khajit Assassin&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;- id: &amp;quot;2&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  name: &amp;quot;Marble&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  description: &amp;quot;Barbarian Alchemist&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To accomplish this, we need to get the row &lt;code&gt;headers&lt;&#x2F;code&gt; which can be also
found with the &lt;code&gt;car&lt;&#x2F;code&gt; of the &lt;code&gt;table&lt;&#x2F;code&gt; parameter. We then use a
functional zip with the headers and each row values, format
accordingly and profit. With a quick &lt;code&gt;zip&lt;&#x2F;code&gt; shiv, it looks like this.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;header &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s: &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; header value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall zip headers values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That finishes the core formatter.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;front-matter-and-jekyll&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#front-matter-and-jekyll&quot; aria-label=&quot;Anchor link for: front-matter-and-jekyll&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Front Matter and Jekyll&lt;&#x2F;h2&gt;
&lt;p&gt;So this exporter is aimed for Jekyll and I know little about YAML
since I rarely use it.&lt;&#x2F;p&gt;
&lt;p&gt;I only want to discuss how the key is produced. You can simply take
the key as is but what if it has spaces? I find it odd having spaces
within object keys, so I prefer to hyphenate it and lowercase for my
ease but obviously you can change it to be camelCase if you want.
Using this in Jekyll, it will look like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;headers
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Shiv camel casing
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;regexp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;downcase header&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car table&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Rest of the code
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;javascript&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-javascript &quot;&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;for watch &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;in &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;site&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;official&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;watch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f5b55f;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;{ watch.field &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;% &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;endfor &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As an example on this, my watch list has a &lt;code&gt;Public Rating&lt;&#x2F;code&gt; field and
my question is how will you access it with a dot notation? You are
welcome to inform me how but I wouldn&#x27;t like how it would feel and I
am comfortable writing &lt;code&gt;watch.public-rating&lt;&#x2F;code&gt; instead. Aside from that
I have nothing much to say about the naming convention and quoting the
value just in case it gets too long.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;default-properties&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#default-properties&quot; aria-label=&quot;Anchor link for: default-properties&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Default Properties&lt;&#x2F;h2&gt;
&lt;p&gt;As a final exploration, let&#x27;s see how to set the default export
options for a table. I thought setting a header property would be good
enough but according to &lt;code&gt;org-set-property&lt;&#x2F;code&gt; I have to put it under a
header which I find weird since the file represents a single solitary
data set but not a big deal. To show that off from my official file:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;org&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-org &quot;&gt;&lt;code class=&quot;language-org&quot; data-lang=&quot;org&quot;&gt;&lt;span&gt;* Official Watch List
&lt;&#x2F;span&gt;&lt;span&gt;   :PROPERTIES:
&lt;&#x2F;span&gt;&lt;span&gt;   :TABLE_EXPORT_FILE: official-watch-list.yaml
&lt;&#x2F;span&gt;&lt;span&gt;   :TABLE_EXPORT_FORMAT: fn&#x2F;orgtbl-to-yaml
&lt;&#x2F;span&gt;&lt;span&gt;   :END:
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;   Yes, I have an unofficial watch list for myself
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For my use case when updating my watch list, I want to auto export
then publish the table when it is saved just like my
&lt;code&gt;org-jekyll-blogger-auto-publish-on-save&lt;&#x2F;code&gt; from &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;org-jekyll-blogger.el&quot;&gt;org-jekyll-blogger.el&lt;&#x2F;a&gt;.
It takes a few minutes to write that glue code:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;blogger&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-and-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;publish &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Export a table and publish the file accordingly.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;at&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;called&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactively&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &amp;#39;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;No table at point to publish.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Point is not at a table&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;TABLE_EXPORT_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;No TABLE_EXPORT_FILE property&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;noselect export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer export&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Table published.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;blogger&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;auto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Auto export and publish table on save.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;after&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;org-jekyll-blogger-export-and-publish t t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Not the best code but it does the job and not that hard to write
although I had to peek at &lt;code&gt;org-table-export&lt;&#x2F;code&gt; to determine the name of
the file. A small point in this code is using &lt;code&gt;called-interactively-p&lt;&#x2F;code&gt;
which merely indicates if the containing function is called as a
command(via &lt;code&gt;M-x&lt;&#x2F;code&gt; or &lt;code&gt;execute-extended-command&lt;&#x2F;code&gt;) or a function(via
Elisp); this allows me to either throw an error message or an info
message depending on the context. For example, using it directly you
should get an error that you need to mark what table you should export
with the point; but if it is called by a hook, you wouldn&#x27;t want it to
throw an error since there might be other hooks in play so better an
info message.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The two things I deliberately ignored are performance and escaping but
I pray I not see more than 10,000 visual experiences before I worry
about it. With this base, you can come up with a &lt;a href=&quot;https:&#x2F;&#x2F;duckduckgo.com&#x2F;l&#x2F;?kh=-1&amp;amp;uddg=https%253A%252F%252Fen.wikipedia.org%252Fwiki%252FJSON&quot;&gt;JSON&lt;&#x2F;a&gt; exporter from a
quick read. For me, I can continue to work with my &lt;code&gt;org&lt;&#x2F;code&gt; workflow and
not worry about the export format.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>That Thing Called Tadhana - Open Ended Love</title>
          <pubDate>Wed, 18 Jan 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/watcher/that-thing-called-tadhana-open-ended-love/</link>
          <guid>https://fnlog.dev/watcher/that-thing-called-tadhana-open-ended-love/</guid>
          <description>&lt;h2 id=&quot;open-ended-endings&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#open-ended-endings&quot; aria-label=&quot;Anchor link for: open-ended-endings&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Open Ended Endings&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;That Thing Called Tadhana&lt;&#x2F;strong&gt;&lt;&#x2F;strong&gt; uses its ending to support its question
and journey&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Open ended endings are endings that leaves the resolution to the
audience. Or it can be a sequel-bait or cop-out depending on how it is
executed. If the ending answers the message, what happens to the
message when then ending is open? The simple answer is that the
message has no easy answer, that it cannot be just a yes or no. This
kind of ending wants to you to think about the message more than it
wants it answered which is why I have a soft spot for it when done
correctly.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t have high expectations for Tagalog movies since it is
populated with low brow romantic comedies. If I hear someone say
&amp;quot;pangmasa&amp;quot; again as an excuse for lack of quality, I will glare at
that person. Once in a while, there is a rare gem of a film that I can
be proud of being a Philippine movie goer. &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;That%5FThing%5FCalled%5FTadhana&quot;&gt;That Thing Called Tadhana
(2014)&lt;&#x2F;a&gt; is that rare gem despite appearing to be a romantic comedy.&lt;&#x2F;p&gt;
&lt;p&gt;At face value with the title and &lt;a href=&quot;http:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=KvLVWTaUT5w&quot;&gt;trailer&lt;&#x2F;a&gt;, it looks like a romantic
comedy that any genre savvy person would have seen more time than the
number of seats in a theater. Skeptical as I am even with the
accolades it has won, I approached this movie with apprehension and I
was happy to be wrong. By a casual viewing, this movie is refreshing
and down-to-earth which removed the need to break the mood with
needless comedy. Where this shines for me is how it asks what love
means in a relationship and how it executes its ending to support
that.&lt;&#x2F;p&gt;
&lt;p&gt;My focus will be on the main question it raises, the meaning of their
shared trip and what the ending&#x27;s answer is.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;SPOILER WARNING&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;NOTE: Compressed screenshots are simply visual aids on which scene it&lt;&#x2F;strong&gt;
&lt;strong&gt;occured, not the actual video quality which is pretty high.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-question-of-love&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#a-question-of-love&quot; aria-label=&quot;Anchor link for: a-question-of-love&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
A Question Of Love&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;If it&#x27;s meant to be, it will be?&lt;&#x2F;p&gt;
&lt;p&gt;If he&#x27;s destined for you, he will come back to you?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;that-thing-called-tadhana-open-ended-love&#x2F;a-question-of-fate.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The film is thankfully very simple and straightforward, it is explicit
with its symbols and is dialogue heavy; however, it has good
cinematography, several long takes and revels in its quiet moments
which is a rarity. Being genre savvy, it implies these two will move
on and hook up by the end and the film will preach to move on with
your life. By title alone the theme is if it is stupid to believe in
romantic fate or &amp;quot;tadhana&amp;quot;.&lt;&#x2F;p&gt;
&lt;p&gt;With the same impression, the main question and the expectation of the
journey are in conflict: the former suggest that each of them will go
back since it is fate while the latter suggest that they move on and
hook up. Experiencing a breakup leads to the question of believing in
fate and as long as the question remains unresolved, so does the
heartache linger. Do you believe in the one you love or move on?&lt;&#x2F;p&gt;
&lt;p&gt;Typically, the endings gives the answer or which it sides but first
let us take a look at the actors and what side they represent.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-journey&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-journey&quot; aria-label=&quot;Anchor link for: the-journey&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Journey&lt;&#x2F;h2&gt;
&lt;p&gt;In understanding the characters, let&#x27;s see the mechanics in which they
grow. Two well-adjusted people meet up accidentally while take a
sight-seeing journey, what a simple way to express moving on from
heartache. No concern of money and circumstance but of heartache and
solace.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;that-thing-called-tadhana-open-ended-love&#x2F;looking-back-and-forward.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s take a look our characters from their heartache.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-girl&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-girl&quot; aria-label=&quot;Anchor link for: the-girl&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Girl&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;that-thing-called-tadhana-open-ended-love&#x2F;mace.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The woman who was left behind by his boyfriend for a better future in
another country. Some time later, she decided to visit his boyfriend
but only found him living with another woman. After that, she feels
torn and carries the ache with her; but she still loves him despite
being tired and hurt. She tried to fight but lost and now carries
that pain.&lt;&#x2F;p&gt;
&lt;p&gt;In the view of romantic fate, she believed and acted for her lover
but wasn&#x27;t reciprocated in the end.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-boy&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-boy&quot; aria-label=&quot;Anchor link for: the-boy&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Boy&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;that-thing-called-tadhana-open-ended-love&#x2F;anthony.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The man who refused marriage and lost his girlfriend in the process.
It his not that he didn&#x27;t love his girlfriend but that his girlfriend
demanded more responsibility and commitment which he could not give
at the time. She left him but he did not chase her, letting fate
decide if they are meant to be. Without action, he has moved on but
still feels empty.&lt;&#x2F;p&gt;
&lt;p&gt;Using the previous lens, his inaction shows belief in it because if
she is his destiny then she will come back but is rebuked and
suffering for his choice since he knows that she has settled down and
has a family.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-heart-and-the-arrow&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-heart-and-the-arrow&quot; aria-label=&quot;Anchor link for: the-heart-and-the-arrow&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Heart And The Arrow&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;that-thing-called-tadhana-open-ended-love&#x2F;the-heart-and-the-arrow.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The unfinished story of Mace about the heart and the arrow is
representative of both the Mace and Anthony and their relationship.
In this story, Mace is the heart while Anthony the arrow. According
to it, the heart slid of the arrow because the arrow kept
denying that was his; the lack of commitment from the arrow made the
heart move on but the arrow still felt empty. Importantly, this
analogy is foreshadowing the end of their journey.&lt;&#x2F;p&gt;
&lt;p&gt;The film&#x27;s lens indicates that both believed but acted differently
thus symbolizing their stances.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;end-of-the-road&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#end-of-the-road&quot; aria-label=&quot;Anchor link for: end-of-the-road&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
End Of The Road&lt;&#x2F;h3&gt;
&lt;p&gt;I can delve into how quaint and nice their journey is but it is the
end of the pilgrimage that is most intriguing. When returning from
their vacation, they find Mace&#x27;s former lover at her doorstep wanting
to get back to her which Anthony goes on ahead.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;that-thing-called-tadhana-open-ended-love&#x2F;the-end-of-the-tale.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;This scene undermines the whole journey as well as magnify the
positions the characters are. In one perspective, they are their
former lovers where Anthony is the one who leaves and is never chased
while Mace is the one found with another man and is being begged.
Fulfilling their roles in the tale, the arrow when confronted denied
staying with the heart and let her slip off once more.&lt;&#x2F;p&gt;
&lt;p&gt;If you breakdown the action of each character, it means different for
each of them and what the journey means. Anthony has first choice
whether to fight for Mace or leave, it reflects his growth on the
journey but is ultimately meaningless as he goes ahead. Next, Mace
has a choice of asking Anthony to stay, it shows her acceptance in
moving on but again denied. Lastly, Anthony has the final choice of
fighting for Mace, which would indicate his commitment and love for
her but instead gives way. At each step, there is a thematic
significance and questioning of the message and journey itself.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ambiguity&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ambiguity&quot; aria-label=&quot;Anchor link for: ambiguity&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Ambiguity&lt;&#x2F;h2&gt;
&lt;p&gt;I liked it that Mace&#x27;s former lover is not truly characterized. We do
not know why he left her, we do not know the circumstance of him
coming back, and we will never know his intentions; at the least, he
has come back to fulfill fate or returning to the one you love. With
this however, it seems to invalidate the growth of the journey.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;that-thing-called-tadhana-open-ended-love&#x2F;the-completed-tale.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The final scene of the film has Anthony finish the incomplete story of
Mace and decides to find her and fight for her once more which is both
stereotypical and subversive in context. He fights for her after
losing her which is indeed typical of a romantic comedy but the
subversion here is we don&#x27;t know what happened to Mace. It might be
futile but he now plays the role of Mace in this regard, that their
time together might afford one more chance. The film then leaves the
audience with a shot of the completed book leaving us with an open
ending.&lt;&#x2F;p&gt;
&lt;p&gt;Here is where the tale takes a deeper meaning. Mace&#x27;s unfinished tale
is open-ended or without closure. Anthony giving it an ending and form
is symbolic of the film itself. However, until he gives it to her, it
is not complete which still leaves the events open as before. We don&#x27;t
know if this action is ultimately futile or romantic but isn&#x27;t that
what love is? Blind and stupid and also a dream.&lt;&#x2F;p&gt;
&lt;p&gt;So in the end, what is the meaning of the ending being unresolved?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;staying-in-love&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#staying-in-love&quot; aria-label=&quot;Anchor link for: staying-in-love&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Staying In Love&lt;&#x2F;h2&gt;
&lt;p&gt;Examining the theme of romantic fate. If you believe in romantic fate,
you are positioned to have Mace in a relationship and Anthony fail in
his endeavor. If you don&#x27;t, you believe Mace will reject her former
lover and accept Anthony in the ending. In either case, Mace&#x27;s former
lover symbolizes the goal of the journey; by rejecting him rejects the
belief, but by accepting him rejects the journey.&lt;&#x2F;p&gt;
&lt;p&gt;Despite these contradictions, neither is it wrong to believe in
romantic fate nor fighting against it. Imagination and lust is what
writes stories while strength and desire is why we fight against it.
To accept and deny fate is both romantic. If the ending does choose a
side, it denies one that makes romances very subtle and complex. Love
is not a size fits all, sometimes letting things be and sometimes
fighting are valid actions as shown by Mace. So by leaving the ending
open, it neither denies itself at the same time the complexity of
being stupidly in love. You know, you idiots.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;watcher&#x2F;that-thing-called-tadhana-open-ended-love&#x2F;opening-lines.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Moving on is not wrong but it shows how waiting and letting things
boil is also an option. If Mace waited and never took the journey, she
is justified in her belief and patient by letting her lover miss her;
but the journey gave her strength while sleeping on it. Acting and
waiting. This shows that neither belief is completely wrong and can
coexist.&lt;&#x2F;p&gt;
&lt;p&gt;That is also why this ending makes sense in context, because no one is
ultimately wrong. One could take sides, find reason out who is more
justified or discover interpretations but finding who is meant for
each other is really the sentiment. I am not an expert in love, I
merely understand the struggle presented by Mace and Anthony and I
hope they find their destiny.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;meta-conflict&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#meta-conflict&quot; aria-label=&quot;Anchor link for: meta-conflict&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Meta Conflict&lt;&#x2F;h2&gt;
&lt;p&gt;Let&#x27;s look at the conflict in expectations with everything in mind.
The showdown at the end is subverted by not being loud and dramatic.
This scene typically ends up where the man pleads to the woman and
getting back together; however, this scene is presented as a real
issue for the main couple hooking up at the same time making their
relationship secondary. At the same time, Anthony leaving subverts the
typical need to fight during a conflict and show the woman his love;
his leaving can be interpreted as allowing Mace to find closure which
shows more concern for her than inaction while also fulfilling the
failed scenario of a having a problem before truly hooking up. Lastly,
showing they aren&#x27;t together in the end is the most obvious subversion
of a romantic film.&lt;&#x2F;p&gt;
&lt;p&gt;This film is full of subverted expectations which doubles in showing
how complicated the circumstances are for this film. Rejecting the
expectations is rejecting the notion of being boxed in about romantic
fate.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;So the use of open-ended ending here explores romantic fate whereas
the use of it in &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;The%5FGarden%5Fof%5FWords&quot;&gt;The Garden Of Words&lt;&#x2F;a&gt; explores maturity in relationship
and both films are stronger for doing so. That is why I have a soft
spot for it, it doesn&#x27;t need to answer itself but let the audience be
immersed by the possibility and meaning. I recommend this film if not
for the meaningful ending and subversion, but by the simple and
reserved romance it presents.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Using vlc With w3m</title>
          <pubDate>Wed, 11 Jan 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/using-vlc-with-w3m/</link>
          <guid>https://fnlog.dev/dev/using-vlc-with-w3m/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ve been using the &lt;a href=&quot;https:&#x2F;&#x2F;duckduckgo.com&#x2F;l&#x2F;?kh=-1&amp;amp;uddg=http%253A%252F%252Fw3m.sourceforge.net%252F&quot;&gt;w3m&lt;&#x2F;a&gt;, the text web browser, with Emacs and it is
fantastic. Aside from losing color and layout, it is faster and
lighter than using a graphical based browser and extensible as
&lt;a href=&quot;https:&#x2F;&#x2F;duckduckgo.com&#x2F;l&#x2F;?kh=-1&amp;amp;uddg=http%253A%252F%252Fconkeror.org%252F&quot;&gt;conkeror&lt;&#x2F;a&gt; since it has Elisp by association. One common activity with
web browsing is online video streaming with sites such as &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;&quot;&gt;youtube&lt;&#x2F;a&gt; or
&lt;a href=&quot;https:&#x2F;&#x2F;www.netflix.com&quot;&gt;netflix&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In Emacs 25, the promise to browse the web and develop with the &lt;a href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;WebKit&quot;&gt;WebKit&lt;&#x2F;a&gt;
extension has not been quite fulfilled or stable yet, so browsing
video streaming sites within buffers or simply the text browser might
not be possible yet. A good workaround is to summon an external video
player like &lt;a href=&quot;http:&#x2F;&#x2F;www.videolan.org&#x2F;vlc&#x2F;&quot;&gt;vlc&lt;&#x2F;a&gt; that can take a video url from the text browser and
pop the video up locally. Of course, media players could have plugins
to find online videos but I am here to emphasize the extensible nature
of Emacs.&lt;&#x2F;p&gt;
&lt;p&gt;This is easy to shiv together with this &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;dadaca70121cb71aaa85762b0d03723d&quot;&gt;glue&lt;&#x2F;a&gt; and here is what it
looks like.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;using-vlc-with-w3m&#x2F;w3m-vlc.gif&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;The video player will popup but refrained from showing due to possible
copyright and both the link and video gets is used for example. This
video is &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=wQDoN40-%5FC4&quot;&gt;Faure&#x27;s Pavane&lt;&#x2F;a&gt; that still gives me a soulful chill so check
it out. The key command here is &lt;code&gt;fn&#x2F;w3m-view-video&lt;&#x2F;code&gt; which takes &lt;code&gt;this&lt;&#x2F;code&gt;
(url at point) or &lt;code&gt;current&lt;&#x2F;code&gt; (page) url and passes is on via
&lt;code&gt;start-process&lt;&#x2F;code&gt;. Nothing really fancy here so let&#x27;s explore this idea
further.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;w3m&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#w3m&quot; aria-label=&quot;Anchor link for: w3m&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
w3m&lt;&#x2F;h2&gt;
&lt;p&gt;What made me think about using a text based browser recently? Aside
from it being lighter and faster, it is really about me living in
Emacs as much as possible. When I want to browse just a single
simple web page, I decide whether it is worth opening a GUI aside from
breaking the buffer lifestyle. It has been in my to-do list to explore
the possibility of using &lt;span class=&quot;underline&quot;&gt;w3m&lt;&#x2F;span&gt; but the loss of colors and layout is
such a big mental block. Once again forgotten, I scrambled my fingers
and memory on how to use the browser within Emacs.&lt;&#x2F;p&gt;
&lt;p&gt;Weirdly, the transition wasn&#x27;t that hard or long. After some reading
and tweaking, I am now browsing within Emacs. I was impressed that the
&lt;span class=&quot;underline&quot;&gt;conkeror&lt;&#x2F;span&gt; functionality of following links by number or &lt;span class=&quot;underline&quot;&gt;w3m-lnum&lt;&#x2F;span&gt;
made the transition much easier. Of course there are still browsing
issues with certain sites, cookies and javascript but I wish I made
the switch quite earlier.&lt;&#x2F;p&gt;
&lt;p&gt;One thing I needed was how to view online videos? Since there is no
widget for video streaming in Emacs, I have to relinquish the buffer
life here. I took it up as a study to write the glue code for it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vlc&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#vlc&quot; aria-label=&quot;Anchor link for: vlc&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
vlc&lt;&#x2F;h2&gt;
&lt;p&gt;My video player in Linux. Thankfully it can run online videos by
passing the url of it as says in the manual.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;# http:&#x2F;&#x2F;&amp;lt;server address&amp;gt;[:&amp;lt;server port&amp;gt;]&#x2F;[&amp;lt;file&amp;gt;]           HTTP stream
&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#effffe;&quot;&gt;vlc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; https:&#x2F;&#x2F;www.youtube.com&#x2F;watch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;v=wQDoN40-_C4
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Power to the command line for more complex invocations. Some
configurations such as subtitle and the window position can be passed
on and thanks to Emacs&#x27; &lt;code&gt;start-process&lt;&#x2F;code&gt; this is not a big deal.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;w3m-vlc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;vlc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--loop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, if you want make it configurable on what arguments to pass,
you have to use this weird invocation or create a wrapper for
&lt;code&gt;start-process&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;args &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--loop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--no-video-title&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;start-process
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;append
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;w3m-vlc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;vlc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;args
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name command command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;start-process
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; command&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Either way, you have to concatenate the default args with the supplied
one although I still find it a little messy. So if you have an
external program you want to integrate with Emacs, this is commonly
found.&lt;&#x2F;p&gt;
&lt;p&gt;If you use this snippet, you might be opening too many video players
and might want to avoid too many popups. So let&#x27;s talk about managing
processes next.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;process-management&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#process-management&quot; aria-label=&quot;Anchor link for: process-management&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Process Management&lt;&#x2F;h2&gt;
&lt;p&gt;If you do open a process in Emacs, you can check it out using the
command &lt;code&gt;list-processes&lt;&#x2F;code&gt; as shown below.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;using-vlc-with-w3m&#x2F;hacker&#x2F;images&#x2F;20170111%20-%20list-processes.png&quot;&gt;Screenshot for list-processes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This is a nice tabulated list but this interface just tabulates it,
you can&#x27;t do anything meaningful. I have to import &lt;a href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;list-processes+.el&quot;&gt;list-processes+.el&lt;&#x2F;a&gt;
in order to kill something from it like how &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;prodigy.el&quot;&gt;prodigy.el&lt;&#x2F;a&gt; does it or you
might be stuck closing the window yourself. So let&#x27;s come up with a
simple scheme to manage our video player.&lt;&#x2F;p&gt;
&lt;p&gt;A simple scheme is to have one video associated with one page or
buffer, so if the page is killed or changed the associated player is
closed. The function &lt;code&gt;start-process&lt;&#x2F;code&gt; returns a process object which we
can set to a buffer via buffer local variables, then manage that
variable with &lt;code&gt;w3m-display-hook&lt;&#x2F;code&gt; and &lt;code&gt;kill-buffer-hook&lt;&#x2F;code&gt;. That is what
&lt;code&gt;fn&#x2F;w3m-kill-page-process&lt;&#x2F;code&gt; does, if the page buffer has a working
process it will kill by &lt;code&gt;kill-process&lt;&#x2F;code&gt;. Again nothing fancy here and
you can be on your merry way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;processes&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#processes&quot; aria-label=&quot;Anchor link for: processes&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Processes&lt;&#x2F;h2&gt;
&lt;p&gt;There is one caveat to all of this: since this is an external process,
it is not possible to truly manage it. For my own configuration, I add
the options &lt;code&gt;--one-instance&lt;&#x2F;code&gt; and &lt;code&gt;--play-and-exit&lt;&#x2F;code&gt; which simply
maintains a single &lt;span class=&quot;underline&quot;&gt;vlc&lt;&#x2F;span&gt; instance and automatically closing itself when
done. The problem lies when I use the former option which produces two
possibilities:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Every processes points to the same process&lt;&#x2F;li&gt;
&lt;li&gt;The last processes is the only living process while the rest is killed&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With that in mind, I shiv this code to allocate the last process as
the only living one while the rest is set to &lt;code&gt;nil&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;single&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;If the page process is a singleton, adjust page container accordingly.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;active&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapc
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer page
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;live&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq active&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;local fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer this&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;local fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process active&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;advice&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;video :filter&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-return  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;w3m-single-page-process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Advicing my own function is weird but I find it more appropriate as a
hack instead of being part of the core. However, the real problem lies
in a third possibility:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The process is managed by &lt;span class=&quot;underline&quot;&gt;vlc&lt;&#x2F;span&gt; itself and Emacs just gets dummy
processes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So if I enable said option, it cannot kill the window no matter what I
do with the given process. In the end, it is really just a glue since
the process cannot be ultimately managed which is understandable. The
situation is not just with &lt;span class=&quot;underline&quot;&gt;vlc&lt;&#x2F;span&gt; but probably with other players as
well so there is no need to craft perfect code, just working is
enough.&lt;&#x2F;p&gt;
&lt;p&gt;So if assume one page per video is fine, then this is serviceable.
Sadly, this also shows some limitation of managing processes but one
really has to go to lengths to perfect it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;autoplay&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#autoplay&quot; aria-label=&quot;Anchor link for: autoplay&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Autoplay&lt;&#x2F;h2&gt;
&lt;p&gt;As a final feature, we can add autoplay on specific sites. For
example, we open &lt;span class=&quot;underline&quot;&gt;youtube&lt;&#x2F;span&gt; and want the video to play. For this we can
simply use the &lt;code&gt;w3m-display-hook&lt;&#x2F;code&gt; but we want to be a bit more
cautious. Naively, this will open a video player for each page we
visit. So we have to have a filter on what pages have videos in them.
A simple predicate would be for this intention:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Check if URL is a video.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ignore-errors
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pieces &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;http&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;host &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elt pieces &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elt pieces &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; host &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;www.youtube.com&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prefix&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;watch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          url &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This checks if the path is has &lt;code&gt;&#x2F;watch&lt;&#x2F;code&gt; primarily and ignores parsing
errors. While there are more sites and possibilities, this is enough
for now. Lastly, it is wise to ask for confirmation to open the video
url of the page just in case you just want to browse. The familiar
&lt;code&gt;yes-or-no-p&lt;&#x2F;code&gt; is a common theme here and we can combine that to come
up with this autoplay function:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;this&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;external &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;View this video externally&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;yes-or-no-p
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s is a video, view it with %s?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;executable&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;video&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;w3m-auto-kill-page-process t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;w3m&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;w3m-view-this-video-external t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Easy, so we now have autoplay but this was the primary driving force
in managing the processes since I opened a lot of players during my
own testing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;So this small journey of using processes and &lt;span class=&quot;underline&quot;&gt;w3m&lt;&#x2F;span&gt; was informative.
The question is what else can we do? Here is somethings I tried and
thought of:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Zoning out when retrieving a page or screensaver when retrieving a page&lt;&#x2F;li&gt;
&lt;li&gt;Auto article summarization with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;miso-belica&#x2F;sumy&quot;&gt;sumy&lt;&#x2F;a&gt; which is my &lt;code&gt;gist&lt;&#x2F;code&gt; command in
&lt;span class=&quot;underline&quot;&gt;conkeror&lt;&#x2F;span&gt; and probably a small post.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There are other text-based browsers such as &lt;a href=&quot;http:&#x2F;&#x2F;lynx.browser.org&#x2F;&quot;&gt;Lynx&lt;&#x2F;a&gt; and other browsers
have plugins that does more and probably something more; as for me, I
will be living the rest of my browsing experience with &lt;span class=&quot;underline&quot;&gt;w3m&lt;&#x2F;span&gt; and
probably more to hack with.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>My Blogging Workflow Library</title>
          <pubDate>Tue, 27 Dec 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/my-blogging-workflow-library/</link>
          <guid>https://fnlog.dev/dev/my-blogging-workflow-library/</guid>
          <description>&lt;h2 id=&quot;refactoring&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#refactoring&quot; aria-label=&quot;Anchor link for: refactoring&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Refactoring&lt;&#x2F;h2&gt;
&lt;p&gt;So I moved on to adding &lt;strong&gt;The Watcher&lt;&#x2F;strong&gt; blog which is an accomplishment
in moving from a single to multiple blog setup as well as challenge in
refactoring my scripts into a library and besides I need to refactor.
So the library is in &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;org-jekyll-blogger.el&quot;&gt;org-jekyll-blogger.el&lt;&#x2F;a&gt; and here I talk about my
sensibilities.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;initial-goals&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#initial-goals&quot; aria-label=&quot;Anchor link for: initial-goals&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Initial Goals&lt;&#x2F;h2&gt;
&lt;p&gt;Since this a working version, here are my goals:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Create a draft&lt;&#x2F;li&gt;
&lt;li&gt;Post a draft&lt;&#x2F;li&gt;
&lt;li&gt;Find a post&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;At its core, that all I really want to do. Write and die. To explain
further this is the workflow: create a draft, do something else, find
the draft, thing again, maybe post it, sleep, sleep, review post for
errors, publish. That&#x27;s kinda my workflow more or less.&lt;&#x2F;p&gt;
&lt;p&gt;So here I will talk about my experience in working with it&lt;&#x2F;p&gt;
&lt;h2 id=&quot;previous-structure&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#previous-structure&quot; aria-label=&quot;Anchor link for: previous-structure&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Previous Structure&lt;&#x2F;h2&gt;
&lt;p&gt;When I write a blog entry, I have to deal with to git repositories: my
private org posts and my public jekyll site. I have to emphasize
&lt;strong&gt;private&lt;&#x2F;strong&gt; and &lt;strong&gt;public&lt;&#x2F;strong&gt;, I would just have one structure to hold all
but one would see things that aren&#x27;t ready for public consumption. The
good and sad thing about having a GitHub page. Copying repo commit
message is quite a contrivance.&lt;&#x2F;p&gt;
&lt;p&gt;So in my script I define a project and publish root both pointing to
said repositories. Through the magic of &lt;code&gt;org-publish&lt;&#x2F;code&gt; and
&lt;code&gt;org-publish-project-alist&lt;&#x2F;code&gt;, it is pretty trivial to convert the org
posts to jekyll compliant html files. So I guess there&#x27;s nothing to
talk about there.&lt;&#x2F;p&gt;
&lt;p&gt;The challenge is converting this structure to support multiple blogs
which means multiple roots of sorts. So the design should support
multiple roots and update the use of publishing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;design&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#design&quot; aria-label=&quot;Anchor link for: design&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Design&lt;&#x2F;h2&gt;
&lt;p&gt;My design to create three objects:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Project&lt;&#x2F;strong&gt;
: This represents the root of the org post and the publishing to
the jekyll directory.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Blog&lt;&#x2F;strong&gt;
: This represents a project blog structure.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Post&lt;&#x2F;strong&gt;
: This represents a post(or draft) in a blog.&lt;&#x2F;p&gt;
&lt;p&gt;Simple design really but took me a while to draft. I will elaborate on
the use of each one from a holistic sense.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;project&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#project&quot; aria-label=&quot;Anchor link for: project&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Project&lt;&#x2F;h3&gt;
&lt;p&gt;A project is an object that holds primarily the project and publish
root. Aside from creating the folder for existence, it creates a
master or project publish command which triggers each related blog&#x27;s
own publish command. So whenever a new blog is linked to a project,
it syncs the master publish command to include that blogs publish command.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;blog&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#blog&quot; aria-label=&quot;Anchor link for: blog&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Blog&lt;&#x2F;h3&gt;
&lt;p&gt;A blog is an object that holds the meat of the blog structure. Also
it creates the blog structure that contains drafts, posts and images
and possibly more. More importantly it creates a blog publish command
which contains a content and asset publish command, it is faster to
use the content publish command than publish the whole project;
thankfully, there is &lt;code&gt;org-publish-current-file&lt;&#x2F;code&gt; which figures out
which command to use which finds the content publish.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;post&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#post&quot; aria-label=&quot;Anchor link for: post&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Post&lt;&#x2F;h3&gt;
&lt;p&gt;The actual content object which is the post or draft itself. In
this structure, one has to find the project, the blog directory, the
post or draft directory and then make the file there and also is a
nuance for a draft to just contain the title but a post must contain
a date prefix format so the command must do all those.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;details&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#details&quot; aria-label=&quot;Anchor link for: details&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Details&lt;&#x2F;h2&gt;
&lt;p&gt;Before I continue with the simple design, there are details that I
mulled over in creating this.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;interface&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#interface&quot; aria-label=&quot;Anchor link for: interface&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Interface&lt;&#x2F;h3&gt;
&lt;p&gt;So given all those ideas, the commands
&lt;code&gt;org-jekyll-blogger-create-draft&lt;&#x2F;code&gt; asks you to select a defined
project, then blogs from those project, then the name of the draft.
So I&#x27;ve been mulling over that single interface after experiencing
&lt;code&gt;magit&lt;&#x2F;code&gt;, &lt;code&gt;prodigy&lt;&#x2F;code&gt; and &lt;code&gt;helm&lt;&#x2F;code&gt;; is this multiple choice interface the
best representation?&lt;&#x2F;p&gt;
&lt;p&gt;The problem with my interface is that I only have one project and two
blogs but I still have to select them, a default or previously
selected scheme might work but I feel it might make the flow
inconsistent where you are working in one blog but want to work in
the other but got hampered by that scheme which I means a trade-off
between consistency and convenience. For now I am okay with a
consistent interface.&lt;&#x2F;p&gt;
&lt;p&gt;The other command that challenges this interface is
&lt;code&gt;org-jekyll-blogger-find-draft&lt;&#x2F;code&gt; which asks you to select a project
and blog then select a post or draft. The problem lies in the
representation and sorting, should you also sort draft and post date
and how will you display it. Since I am using &lt;code&gt;helm&lt;&#x2F;code&gt; I am more
inclined to display with a face and formatting, but what about &lt;code&gt;ivy&lt;&#x2F;code&gt;?
Or is better to display all project and blogs post and filter there?&lt;&#x2F;p&gt;
&lt;p&gt;So many questions but I guess the natural route would satisfy
&lt;code&gt;completing-read&lt;&#x2F;code&gt;. Having a custom buffer like &lt;code&gt;magit&lt;&#x2F;code&gt; or &lt;code&gt;prodigy&lt;&#x2F;code&gt;
is a thing to consider in making an interface.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;alist-vs-plist&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#alist-vs-plist&quot; aria-label=&quot;Anchor link for: alist-vs-plist&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Alist vs Plist&lt;&#x2F;h3&gt;
&lt;p&gt;In creating the objects, I did not want to use classes since I am a
functional programmer but rather I needed structs or records. So the
natural choice for me was to use an association list or alist. I like
the concept of list of key-value pairs but it isn&#x27;t easy to write a
list of key properties. The alternative is to use a property list or
plist which is a list of paired symbols and values. For me it just
feels a little more symbolic and contextual.&lt;&#x2F;p&gt;
&lt;p&gt;The sad thing about plist is that it has no support for merging lists
and finding keys which is bonkers. I needed this simple functionality
to merge post options and headers. When working with jekyll, you have
to have preamble of org options and an front matter export block
header. So I decided to have default options and headers, passed to a
project, passed and merged by the blog options and headers, then
finally to a post which inserts into the post. So merging properties
is a key thing I need.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t need &lt;code&gt;dash&lt;&#x2F;code&gt; for a simple library such as this but
alternatives are &lt;code&gt;maps&lt;&#x2F;code&gt; and &lt;code&gt;kv&lt;&#x2F;code&gt; which depend on &lt;code&gt;dash&lt;&#x2F;code&gt; but also add
more functions that I don&#x27;t need. Although I use them in my
configuration, I don&#x27;t really need all the extra bulk. Merging
properties in an alist is simply appending lists but it looks ugly
once you print it out. So I wrote my own and I don&#x27;t like the feel of
it that there is no native support for such but who am I to talk? But
that is one lesson, not adding extra dependencies when writing
libraries.&lt;&#x2F;p&gt;
&lt;p&gt;Between alist and plist, I like representing objects with plist but
not much in terms of functionality but support would be nice.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;namespace&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#namespace&quot; aria-label=&quot;Anchor link for: namespace&quot;&gt;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Namespace&lt;&#x2F;h3&gt;
&lt;p&gt;Since my file name is &lt;code&gt;org-jekyll-blogger&lt;&#x2F;code&gt;, I have to name my library
the same but also prefix my functions with the same name which leads
to very long names such as &lt;code&gt;org-jekyll-blogger-post-draft&lt;&#x2F;code&gt;.
Thankfully, &lt;code&gt;smex&lt;&#x2F;code&gt; helps me get that name quick but the length and
typing is cumbersome specially when you&#x27;re writing and testing it
out. I would rather type it though than have an abstraction layer of
typing namespacing which might just add a layer in testing it out but
I guess I&#x27;m good.&lt;&#x2F;p&gt;
&lt;p&gt;Another thing is the naming convention, whether to use a &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; or a &lt;code&gt;-&lt;&#x2F;code&gt;
to denote a namespace delimiter, then there is the double &lt;code&gt;--&lt;&#x2F;code&gt;
delimiter to represent private variables. Although &lt;code&gt;defcustom&lt;&#x2F;code&gt;,
&lt;code&gt;defvar&lt;&#x2F;code&gt; is enough to understand the intention, viewing it through
&lt;code&gt;describe-variable&lt;&#x2F;code&gt; does not say much. For example, &lt;code&gt;shm&lt;&#x2F;code&gt; has both
&lt;code&gt;&#x2F;&lt;&#x2F;code&gt; and &lt;code&gt;-&lt;&#x2F;code&gt; to represent the public and private symbols. I am not
aware of a real solution for this but when writing my configuration,
I use my prefix &lt;code&gt;fn&#x2F;&lt;&#x2F;code&gt; but when writing libraries I would write it as
&lt;code&gt;fn-&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from my gripes with it, it is not hard to follow but rather
jarring that modules aren&#x27;t really a thing here. I wonder what the
&lt;code&gt;Zen of Python&lt;&#x2F;code&gt; has to say about it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;prototype&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#prototype&quot; aria-label=&quot;Anchor link for: prototype&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Prototype&lt;&#x2F;h2&gt;
&lt;p&gt;So with that, I crafted the simple library with three core commands:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;org-jekyll-blogger-create-draft&lt;&#x2F;li&gt;
&lt;li&gt;org-jekyll-blogger-post-draft&lt;&#x2F;li&gt;
&lt;li&gt;org-jekyll-blogger-find-draft&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I have to admit it was easy to write although I think slow. Sigh.
Instead of writing about it, here&#x27;s a small screencast on what it
looks like...&lt;&#x2F;p&gt;
&lt;p&gt;... and my screencast tool is broken. Looks like I have a lot to
explain. I guess I&#x27;ll just leave it that for now but honestly I have
to get all my tools working.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;extra-features&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#extra-features&quot; aria-label=&quot;Anchor link for: extra-features&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Extra Features&lt;&#x2F;h2&gt;
&lt;p&gt;Simple really but I do note there are other features including the
leftovers from my original script such as:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Auto publish a post on save&lt;&#x2F;li&gt;
&lt;li&gt;Push to GitHub&lt;&#x2F;li&gt;
&lt;li&gt;Sync project blog structure to the published structure&lt;&#x2F;li&gt;
&lt;li&gt;Prodigy integration&lt;&#x2F;li&gt;
&lt;li&gt;Categories and tag completion&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I can shiv the first one quite quickly, what&#x27;s a post without a snippet?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;after&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;save&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;excursion
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;org&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I find it easy to add more features if I wanted. I foresee the use of
hooks and to add the git integration, structure sync and what not. I
am aware of an &lt;code&gt;org-jekyll&lt;&#x2F;code&gt; library but it is no longer used by the
author so it might not be doing the job he wants. Better to write your
own right? Right? If you&#x27;re bored like me then yes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;working-flow&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#working-flow&quot; aria-label=&quot;Anchor link for: working-flow&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Working Flow&lt;&#x2F;h2&gt;
&lt;p&gt;Things are pretty much incremental and more to add on the wish list.
At least I am happy that I can write two blogs that challenge my
creativity more although I rarely write on one. Although my creativity
has been dipping, I will write or die trying.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Inserting Relative Path</title>
          <pubDate>Sat, 15 Oct 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/inserting-relative-path/</link>
          <guid>https://fnlog.dev/dev/inserting-relative-path/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I was working on a &lt;a href=&quot;https:&#x2F;&#x2F;facebook.github.io&#x2F;react-native&#x2F;&quot;&gt;react native&lt;&#x2F;a&gt; application and I needed to insert the
relative path of an import statement based on the current file&#x2F;buffer.
Since this involves files, I immediately checked &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;f.el&quot;&gt;f.el&lt;&#x2F;a&gt; for any function
that would immediately get the relative path from a file to a file.
The closest I got and was &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;f.el#f-relative-path-optional-dir&quot;&gt;f-relative&lt;&#x2F;a&gt; but it wasn&#x27;t cutting it, it was
giving me a file relative to a directory. After an hour or two of
finding which function it is, I decided to just write it myself.&lt;&#x2F;p&gt;
&lt;p&gt;So write it I did and in such poor time, it took me another hour or
two to get it done for whatever reason I could not comprehend. Once I
did that, it was a simple matter to write the commands to get what I
wanted.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;inserting-relative-path&#x2F;insert-relative-path.gif&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Here is a link of the &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;FrancisMurillo&#x2F;02a1c638e9d32b5d8a60e9aa1ad9aa50&quot;&gt;code&lt;&#x2F;a&gt; for the curious. I hope the screencast is
helpful as it is my first and won&#x27;t be my last. I hope I can make more
simpler posts showing something done in Emacs, thanks to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Malabarba&#x2F;camcorder.el&#x2F;&quot;&gt;camcorder.el&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes&quot; aria-label=&quot;Anchor link for: notes&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes&lt;&#x2F;h2&gt;
&lt;p&gt;At first I thought it would be easy to implement by finding their
common parent, determining the relative paths of the source and target
path by &lt;code&gt;f-relative&lt;&#x2F;code&gt;, converting the relative source path into &lt;code&gt;..&lt;&#x2F;code&gt;
and just appending the relative target path with the path separator.
Some things aren&#x27;t just that easy.&lt;&#x2F;p&gt;
&lt;p&gt;But the use of &lt;code&gt;f-relative&lt;&#x2F;code&gt; and &lt;code&gt;f-join&lt;&#x2F;code&gt; did not return consistent
outputs that I expected. So out of frustration, I just decided to find
the common parent instead and thankfully &lt;code&gt;f-split&lt;&#x2F;code&gt; is one thing I can
rely on.&lt;&#x2F;p&gt;
&lt;p&gt;By converting the source and target paths into lists and dropping the
head until it wasn&#x27;t equal, I thought I nailed it but apparently that
wasn&#x27;t enough. I realized after chopping the list of until there was
no common parent, it didn&#x27;t handle the case of neighboring files
properly. What I needed was the last common parent which I dropped. As
hard as I thought about it, I needed a recursive function maintaining
that singular value which is helpful in both cases where either source
or parent node is a parent of one another. I really hoped I didn&#x27;t
have to use a &lt;code&gt;cond&lt;&#x2F;code&gt; and recursion but I had to and it pains me to do
so. Sometimes I just have to bite the bullet.&lt;&#x2F;p&gt;
&lt;p&gt;One small thing also tripped me up is the use of &lt;code&gt;find-file-read-args&lt;&#x2F;code&gt;
where I needed a &lt;code&gt;find-file&lt;&#x2F;code&gt; interface without going to the file. You
could argue I could use &lt;code&gt;find-file-noselect&lt;&#x2F;code&gt; but I didn&#x27;t want to open
the file at all. I just needed the file path, I didn&#x27;t have to open
it. It took me some time to find the function and the hazard that it
returns a pair instead of just the filename. The bigger concern
here is that I might have used a private function and maybe I should
have just read the manual. Oh well.w&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Automatic Prodigy Process Binding</title>
          <pubDate>Sun, 09 Oct 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/automatic-prodigy-process-binding/</link>
          <guid>https://fnlog.dev/dev/automatic-prodigy-process-binding/</guid>
          <description>&lt;h2 id=&quot;preface&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#preface&quot; aria-label=&quot;Anchor link for: preface&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Preface&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s been quite a long time since I made another post. I have been
quite busy with making an app and making a presentation for my
functional programming group which really ate my attention and
creativity. So for now, let&#x27;s see what I can come up with a smaller
piece than what I have done before.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;If you have been using &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;prodigy.el&quot;&gt;prodigy.el&lt;&#x2F;a&gt;, you might get curious on the output
buffer of your services. Assuming you have started the service, there
are two easy ways to check the process buffer out&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;switch-to-buffer&lt;&#x2F;code&gt;
The default way to find any buffer. Whether you use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emacs-helm&#x2F;helm&quot;&gt;helm&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;abo-abo&#x2F;swiper&quot;&gt;ivy&lt;&#x2F;a&gt;
or some buffer management technique, you filter out the name of
the process buffer and go.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;prodigy&lt;&#x2F;code&gt;
The canonical way of finding the process buffers. Once in this
menu buffer, you can search for your process buffer and hit
&lt;code&gt;$&lt;&#x2F;code&gt; (or &lt;code&gt;prodigy-display-process&lt;&#x2F;code&gt;)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;But nothing beats a key binding in both scenarios(, unless you can&#x27;t
memorize key bindings.) So what we want is &lt;strong&gt;when we create a service,
we want a key binding associated to opening it&#x27;s process buffer&lt;&#x2F;strong&gt;. Easy
right?&lt;&#x2F;p&gt;
&lt;p&gt;I filed an &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;prodigy.el&#x2F;issues&#x2F;90&quot;&gt;issue&lt;&#x2F;a&gt; for it but I doubt it would be opened so here I am
telling you about it. If you don&#x27;t want a boring story as usual, here
is the &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;FrancisMurillo&#x2F;97eac4b41ef7aa2365bf32a3cac1157c&quot;&gt;code&lt;&#x2F;a&gt;. Otherwise, let&#x27;s get down with the short details.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;decorating-the-constructor&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#decorating-the-constructor&quot; aria-label=&quot;Anchor link for: decorating-the-constructor&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Decorating The Constructor&lt;&#x2F;h2&gt;
&lt;p&gt;So in making services, how do we make one? The function is
&lt;code&gt;prodigy-define-service&lt;&#x2F;code&gt;. Let&#x27;s define one.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;server&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :command &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :args &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :cwd &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;Fakespace&#x2F;fnlog.io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;server&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At the time of writing, this is my minimal &lt;a href=&quot;https:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;jekyll&lt;&#x2F;a&gt; prodigy service to
serve my blog and to automatically start when it is defined which is
another &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;prodigy.el&#x2F;issues&#x2F;38&quot;&gt;feature&lt;&#x2F;a&gt; that I desire. Okay, so how do we go about customizing
the constructor? There are two ways again.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Make a custom function constructor&lt;&#x2F;p&gt;
&lt;p&gt;This is a safe approach and probably one should lead toward.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;rest args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A wrapper for `prodigy-define-service&amp;#39; with automatic bindings.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;prodigy-define-service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Here is where we strike
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Nothing wrong with this approach. But if you&#x27;re like me, you sense
this is more &lt;strong&gt;function decorating&lt;&#x2F;strong&gt; than anything else; then you will
tend to the other way.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Advice the constructor&lt;&#x2F;p&gt;
&lt;p&gt;Using the benevolent &lt;code&gt;advice-add&lt;&#x2F;code&gt; construct.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;orig&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fun &amp;amp;rest args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;When creating a service, check for a :bind keyword to create an automatic keybinding for it.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;result &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply orig&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fun args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Attack here again
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;advice&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;prodigy-define-service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :around &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;prodigy-define-service-bind-hook&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Slightly more verbose and a little different, we are able to avoid
cluttering constructors with &lt;code&gt;advice-add&lt;&#x2F;code&gt;. But you should avoid
advising functions if you can, it messes up the contract with other
libraries that depend on it and might make things brittle. But when
you do use it, you should consider asking the author for the advised
feature and see if you can work things out.&lt;&#x2F;p&gt;
&lt;p&gt;By saying that, I should have settled on the first approach and not
complicate things and probably mean more and easier to comprehend
that there is a customization on the constructor. I might refactor
my code after making this post. Why did I bother mentioning it? Oh
well.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Regardless of hindsight, let&#x27;s take the second approach since it is
the decorating behavior we want here. The more important thing is now
how do we create the keybinding?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;keybinding&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#keybinding&quot; aria-label=&quot;Anchor link for: keybinding&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Keybinding&lt;&#x2F;h2&gt;
&lt;p&gt;So the canonical way to go about making a key binding is.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key keymap key command&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key key command&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Assuming keymap is global-map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;kbd &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;C-c c c c c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) #&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;garbage-collect&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So we need three things to make a key binding: the &lt;strong&gt;keymap&lt;&#x2F;strong&gt;, the &lt;strong&gt;key&lt;&#x2F;strong&gt;
and the &lt;strong&gt;command&lt;&#x2F;strong&gt;. The command is obviously in our case the prodigy
function which opens the service process buffer. Some digging will
reveal that it is &lt;code&gt;prodigy-switch-to-process-buffer&lt;&#x2F;code&gt; which takes a
service object, one can confirm it with the following snippet.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;server&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That was quick, now we have the &lt;code&gt;switch-to-buffer&lt;&#x2F;code&gt; function for
prodigy. Let&#x27;s wrap it for our own use.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Just an wrapper for said function with SERVICE.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So we now have the third part of the recipe, how do we get the others?
Rather, &lt;strong&gt;how do we define the key binding?&lt;&#x2F;strong&gt; What we is to include some
extra property or option to the constructor, ideally we want something
like this.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;server&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :command &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :args &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :cwd &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;Fakespace&#x2F;fnlog.io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Custom property
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :bind &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;kbd &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;C-c c s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Staying true to the constructor, let&#x27;s define &lt;code&gt;:bind-map&lt;&#x2F;code&gt; and &lt;code&gt;:bind&lt;&#x2F;code&gt;
properties in the keyword constructor where it defines &lt;code&gt;map&lt;&#x2F;code&gt; and
&lt;code&gt;key&lt;&#x2F;code&gt;, respectively. Two problems might occur if we pass in extra
attributes in a constructor: it might throw an error because it can&#x27;t
dispatch the keyword or drop the superfluous keywords which in both
cases implies we have to get the keyword values out before it is
passed in the constructor.&lt;&#x2F;p&gt;
&lt;p&gt;Thankfully this is not the case, running the snippet above yields the following.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;server&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :command &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :args &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :cwd &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;Fakespace&#x2F;fnlog.io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;... output omitted ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :bind &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;... output omitted ...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It basically returns a list of all the current services where the
first one is the one we defined. Looking at the data, it is a property
list where our new keywords our retained. Assuming that let&#x27;s continue
with our attack plan.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;result &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply orig&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fun args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Actual attack
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Just for logging
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bind &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :bind&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Default bind-map to the global keymap
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; bind
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Creating binding for %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Logging
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map bind
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; This is needed since it is a command
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With this implementation we are done. How quick!? So what we did here
is just extract the relevant pieces we need and just plug it in if
&lt;code&gt;bind&lt;&#x2F;code&gt; is filled in. I guess we&#x27;re done right?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cleanliness&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cleanliness&quot; aria-label=&quot;Anchor link for: cleanliness&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Cleanliness&lt;&#x2F;h2&gt;
&lt;p&gt;There is one more enhancement is we can do is to name the view
function. Since we are defining an anonymous command, we can&#x27;t reuse
the command unless you are in favor of &lt;code&gt;command-execute-key&lt;&#x2F;code&gt;. And if
you use &lt;code&gt;which-key&lt;&#x2F;code&gt; and whenever the command is displayed or queried,
it just says &lt;code&gt;lambda&lt;&#x2F;code&gt; or something unhelpful. So this optional section
is primarily just for that. So let&#x27;s refactor the anonymous command.&lt;&#x2F;p&gt;
&lt;p&gt;First, how do we define the command name? We can either ask for it via
&lt;code&gt;:bind-command-name&lt;&#x2F;code&gt; keyword or generate it ourselves. We can create
a quick and safe symbol with &lt;code&gt;gensym&lt;&#x2F;code&gt; like so.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gensym &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;symbol-prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; symbol-prefix800
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We can use that to create a symbol given a prefix. Which in turn is a
good idea, to give our command a prefix or namespace. As for me, I use
the prefix &lt;code&gt;fn&#x2F;&lt;&#x2F;code&gt;. So let&#x27;s put an option to define our namespace.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prefix &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;fn&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;The prefix when creating binding prodigy view commands.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ideally, our command name is prefix plus the bind command name. Which
is easy to work with.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gensym &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;prodigy-view-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;intern &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s%s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prefix command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; How do we create our named command?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lastly, we need to create our function. If you&#x27;re thinking we should
use &lt;code&gt;defun&lt;&#x2F;code&gt; with an &lt;code&gt;interactive&lt;&#x2F;code&gt; spec, then it is slightly more
complicated than just using &lt;code&gt;fset&lt;&#x2F;code&gt; with an anonymous command by a
backtick.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fset my&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interned&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A prodigy view function for %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; service&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quote ,service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is a nice template of wrapping a function into a command. When I
was thinking about it, I knew &lt;code&gt;fset&lt;&#x2F;code&gt; is the go to function when you
want it to be found or discovered aside from &lt;code&gt;defun&lt;&#x2F;code&gt;; the other thing
I found some difficulty is using backtick. If you didn&#x27;t use a
backtick, you can&#x27;t add the documentation string which is a minor
detail or did I just complicate myself again? Oh well.&lt;&#x2F;p&gt;
&lt;p&gt;With that we can wrap it up in a neat bow.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prepared&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Another wrapper to make specific functions for viewing SERVICE.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol-name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gensym &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;prodigy-view-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prefix &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;fmpv&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;intern &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s%s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; prefix command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fset function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          `&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             ,&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A prodigy view function for %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; service&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quote ,service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Going back to our original function.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &amp;amp;rest args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;When creating a service, check for a :bind keyword to create an automatic keybinding for it.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;result &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bind &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :bind&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get service :bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; bind
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Creating binding for %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;key bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map bind
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prepared&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;switch&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;advice&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;prodigy-define-service&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :around &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;prodigy-define-service-bind-hook&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that&#x27;s pretty much it and in action.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prodigy&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;server&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :command &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :args &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :cwd &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;Fakespace&#x2F;fnlog.io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Custom property
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;server-jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :bind&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map global&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  :bind &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;kbd &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;C-c c s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This creates the command &lt;code&gt;fn&#x2F;server-jekyll&lt;&#x2F;code&gt; which is bound to &lt;code&gt;C-c c s&lt;&#x2F;code&gt;. Success!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;closing-words&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#closing-words&quot; aria-label=&quot;Anchor link for: closing-words&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Closing Words&lt;&#x2F;h2&gt;
&lt;p&gt;For now I am pretty happy with the implementation, I can jump to any
prodigy service I defined quickly. There is one thing one can ask from
the author is that how the prodigy buffer is displayed. Like with this
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;prodigy.el&#x2F;issues&#x2F;73&quot;&gt;feature&lt;&#x2F;a&gt;, the process buffer appears in the other window. Not a big
deal.&lt;&#x2F;p&gt;
&lt;p&gt;And with this, I may have no reason to visit the prodigy buffer itself
aside from starting services up. If you wanted to go one up, you could
automatically start a service you visit, which you can decorate the
process switch function. The other feature I came up along with&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pashinin&#x2F;workgroups2&quot;&gt;
workgroups2&lt;&#x2F;a&gt; is to set the default filter per workgroup. For example, I
have five workgroups and each one has a prodigy service tightly tied
with it, I don&#x27;t need to see the other services in the prodigy buffer
since it does not relate to the workgroup.&lt;&#x2F;p&gt;
&lt;p&gt;I wonder what other prodigy features can be made possible.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Best Flex Matcher</title>
          <pubDate>Tue, 13 Sep 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/best-flex-matcher/</link>
          <guid>https://fnlog.dev/dev/best-flex-matcher/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ve been using &lt;a href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&quot;&gt;Emacs&lt;&#x2F;a&gt; for quite some time now and used both &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nonsequitur&#x2F;smex&quot;&gt;smex&lt;&#x2F;a&gt; and
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emacs-helm&#x2F;helm&quot;&gt;helm&lt;&#x2F;a&gt; as my commander. (pun somewhat intended.) But when I started, it
was just &lt;a href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;InteractivelyDoThings&quot;&gt;ido&lt;&#x2F;a&gt; and the phenomenal &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lewang&#x2F;flx&quot;&gt;flex matching&lt;&#x2F;a&gt; feature which makes
command searching faster and easier. I encourage you to read or use flex
matching before continuing but the easiest explanation I can give is
that *given a list of function names and a search text, return all the
functions that contain all the letters of the search text in the
function name, sequentially*.&lt;&#x2F;p&gt;
&lt;p&gt;Not the best perhaps but I do want to stress the word &lt;strong&gt;sequential&lt;&#x2F;strong&gt;
because it is not the typical substring search. Maybe one or two
examples might help.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s say we have a function &lt;code&gt;emacs-lisp&lt;&#x2F;code&gt;, we can match it with the
substring &lt;code&gt;emacs&lt;&#x2F;code&gt;, &lt;code&gt;lisp&lt;&#x2F;code&gt; or &lt;code&gt;cs-li&lt;&#x2F;code&gt; but not &lt;code&gt;el&lt;&#x2F;code&gt; or &lt;code&gt;ep&lt;&#x2F;code&gt;; however, flex
matching will match &lt;code&gt;el&lt;&#x2F;code&gt; because &lt;code&gt;e&lt;&#x2F;code&gt; and &lt;code&gt;l&lt;&#x2F;code&gt; appear sequentially in the
name and likewise &lt;code&gt;ep&lt;&#x2F;code&gt; but not &lt;code&gt;me&lt;&#x2F;code&gt; although both letters appear in the
name but are not sequential. I love to call this kind of matching
&lt;strong&gt;forward character matching&lt;&#x2F;strong&gt; but that&#x27;s just me.&lt;&#x2F;p&gt;
&lt;p&gt;After getting used to this kind matching and a thousand functions to
scan, one naturally asks the question &lt;strong&gt;what is the smallest search text
that will match a target?&lt;&#x2F;strong&gt; My sample target is &lt;code&gt;emacs-lisp-mode&lt;&#x2F;code&gt; and
what I hope to understand is whether &lt;code&gt;elmo&lt;&#x2F;code&gt; is one of the flex matching
candidate for the job.&lt;&#x2F;p&gt;
&lt;p&gt;To limit the problem so that it doesn&#x27;t explode, the question is roughly
&lt;strong&gt;using &lt;code&gt;smex&lt;&#x2F;code&gt;, what are the smallest matching search text for a
command?&lt;&#x2F;strong&gt; So if you don&#x27;t use &lt;strong&gt;Emacs&lt;&#x2F;strong&gt; or &lt;strong&gt;smex&lt;&#x2F;strong&gt; as your flex matcher,
reading this article might have little mileage for you but if you want
to hear the journey, let&#x27;s ride.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;before-coding&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#before-coding&quot; aria-label=&quot;Anchor link for: before-coding&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Before Coding&lt;&#x2F;h2&gt;
&lt;p&gt;For those who want the code instead of a boring explanation, here it &lt;a href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;FrancisMurillo&#x2F;8d2d895f01d502a6d1d572190b9ef820&quot;&gt;is&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Here is an outline of how things would go. Given a function name, do the following&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Check if the function exists, bail if there is not&lt;&#x2F;li&gt;
&lt;li&gt;Generate all possible flex matching &amp;quot;substring&amp;quot; from that name&lt;&#x2F;li&gt;
&lt;li&gt;For each substring, get the possible matches and rate it by order&lt;&#x2F;li&gt;
&lt;li&gt;Filter out those matches with the highest order&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Looks simple but there is one critical thing hard with this. The word
&lt;strong&gt;generate&lt;&#x2F;strong&gt; whispers &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Combinatorial%5Fexplosion&quot;&gt;combinatorial explosion&lt;&#x2F;a&gt; which screams &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Garbage%5Fcollection%5F(computer%5Fscience)&quot;&gt;garbage
collection&lt;&#x2F;a&gt; which pretty much means performance and memory problems. In
doing this in the &lt;a href=&quot;http:&#x2F;&#x2F;c2.com&#x2F;cgi&#x2F;wiki?EmacsAsOperatingSystem&quot;&gt;best OS&lt;&#x2F;a&gt;, this will block the UI which is bad like in
&lt;strong&gt;JavaScript&lt;&#x2F;strong&gt;. There are probably many ways to address this but the way I
go about it is with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Reactive-Extensions&#x2F;RxJS&quot;&gt;lazy streams&lt;&#x2F;a&gt; and &lt;a href=&quot;http:&#x2F;&#x2F;clojure.org&#x2F;reference&#x2F;transducers&quot;&gt;transducers&lt;&#x2F;a&gt; which tries to
emulate &lt;a href=&quot;https:&#x2F;&#x2F;tc39.github.io&#x2F;ecmascript-asyncawait&#x2F;&quot;&gt;async await&lt;&#x2F;a&gt;. Or I can just let the UI block for minutes while I
twiddle my thumb and be done with it but that wouldn&#x27;t be fun to explore
would it?&lt;&#x2F;p&gt;
&lt;p&gt;Truly, this is article is more of an exploration of doing asynchronous
computation in &lt;strong&gt;Emacs&lt;&#x2F;strong&gt; that is inspired by solving the best flex
matching candidates. As another shameless plugs, I made the aptly named
libraries &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;stream.el&quot;&gt;stream.el&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;transducer.el&quot;&gt;transducer.el&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;promise.el&quot;&gt;promise.el&lt;&#x2F;a&gt; to support this
endeavor. We will explore the role of each one and how it will achieve
our goals.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;streams&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#streams&quot; aria-label=&quot;Anchor link for: streams&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Streams&lt;&#x2F;h2&gt;
&lt;p&gt;Lists. The basic form of collection. As the collection grows, mapping
over it takes longer which is natural. Dealing with a permutation of a
long text, the number of candidates can grow to millions and if a
mapping function takes time then it is compounded. What we want is to
map over a huge list without blocking, what we are really asking is to
defer the computation or be lazy. How about a snippet?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Use your imagination
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq xs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;of&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;...&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;million &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;items&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Millions of items
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      mapper &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;long&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;operation&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; A long operation
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; mapper xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Get a cup of coffee
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With &lt;code&gt;stream.el&lt;&#x2F;code&gt;, we can do it in a deferred fashion.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2 3 4 5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Start the stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; steam-start
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Streams as just a function invokation
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Invoking the stream function yields the next value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 4
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 5
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; End of the stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; stream-stop
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; No more values
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; stream-stop
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It is a little more contrived but we can say when we want the next value
with a function call. With that in mind, let&#x27;s map over the stream.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq xs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2 3 4 5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      mapper &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;1+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      ys&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;rest _&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Common stream idiom
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Ignore start-value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Handle stop-value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stop&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stop
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Actually map over it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall mapper x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; stream-start
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 4
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 5
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 6
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; stream-stop
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Even if &lt;code&gt;xs&lt;&#x2F;code&gt; is a small or huge list, we can control when the value is
computed and thus avoid blocking although the code is more verbose.
Let&#x27;s apply this to our problem of generating the flex matching
candidates. Our problem of finding all flex match substrings is roughly
equivalent to printing out all binary strings of a certain length. With
the help of inductive reasoning and recursion, we have the following
implementation.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;dash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fbo&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;forward&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;letrec &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recurser
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;cond
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;empty&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Base cases
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Optimized non-trivial case
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Inductive case
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall recurser rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;append
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;partial &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;concat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reducer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall recurser text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is the original implementation with &lt;code&gt;transducers&lt;&#x2F;code&gt; which in this
case is an equivalent of &lt;code&gt;mapcar&lt;&#x2F;code&gt;. Take your time to grok it or use it
if you can. Now if you do, try running &lt;code&gt;(fbo&#x2F;text-forward-permutations &amp;quot;emacs-lisp-mode&amp;quot;)&lt;&#x2F;code&gt; and tell me how long it took to complete it? If it
ran without blocking a bit, then I envy your hardware specs. Now let us
see convert the blocking lists to lazy streams.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;forward&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;letrec &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recurser
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;cond
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;empty&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall recurser rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;copy &amp;#39;empty rest&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;base&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;next&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;repeat-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;append
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;partial &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;concat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 base&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                next&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall recurser text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Did you notice the difference? At the surface, it just basically wrapped
the list return as streams. At a deeper look, there is an additional
&lt;code&gt;stream-copy&lt;&#x2F;code&gt; function and the destructuring of it with &lt;code&gt;base-stream&lt;&#x2F;code&gt;
and &lt;code&gt;next-stream&lt;&#x2F;code&gt;. This is the fundamental difference between lists and
streams: &lt;strong&gt;lists can be consumed repeatedly while streams are not.&lt;&#x2F;strong&gt; In
the &lt;code&gt;stream&lt;&#x2F;code&gt; example above, once you reach &lt;code&gt;stream-stop&lt;&#x2F;code&gt; you cannot go
back to the beginning which implies that a stream can only be consumed
once. So if you want to reuse the stream with their values, one has to
copy it with &lt;code&gt;stream-copy&lt;&#x2F;code&gt;. The other thing is how it is consumed; lists
are data structures while streams are function closures. Despite these
two fundamental differences, it was easy to switch from a list to a
stream implementation thanks to the abstraction of &lt;code&gt;transducers&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;So what we have now is the first part of the algorithm, now we can move
on to figuring out how to get the candidates or matches given a
substring.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;transducers&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#transducers&quot; aria-label=&quot;Anchor link for: transducers&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Transducers&lt;&#x2F;h2&gt;
&lt;p&gt;So we have lazy streams but that doesn&#x27;t stop it from consuming a list
of million items and taking its sweet time mapping over it. Let&#x27;s
checkout how to get the candidates of a flex match with &lt;code&gt;smex&lt;&#x2F;code&gt; while
suspending your disbelief for &lt;code&gt;transducers&lt;&#x2F;code&gt; for now.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;dash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;car&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list smex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cache&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;regexp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quote &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aref text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mapconcat
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;[^&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;]*&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;regexp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quote &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &amp;quot;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The main idea is to convert the &lt;code&gt;smex-cache&lt;&#x2F;code&gt; into a list of function
names with &lt;code&gt;fb&#x2F;function-symbol-stream&lt;&#x2F;code&gt; which is our source of truth. Of
course, it is stream that emits symbols, so we massaged or mapped it a
bit from the &lt;code&gt;smex-cache&lt;&#x2F;code&gt; cons list.&lt;&#x2F;p&gt;
&lt;p&gt;Now how do we filter which is our candidates? We convert the search text
into a regex with &lt;code&gt;fb&#x2F;flex-match-text&lt;&#x2F;code&gt; and filter the source stream with
it, which I just plundered from &lt;code&gt;ido&lt;&#x2F;code&gt;. To get a grasp of this, let&#x27;s use
&lt;code&gt;elmo&lt;&#x2F;code&gt; as a substring. Using &lt;code&gt;(fb&#x2F;flex-match-text &amp;quot;elmo&amp;quot;)&lt;&#x2F;code&gt;, it would
output &lt;code&gt;e[^l]*l[^m]*m[^o]*o&lt;&#x2F;code&gt;, looks weird but it does its job. Testing
it out with &lt;code&gt;(s-match &amp;quot;e[^l]*l[^m]*m[^o]*o&amp;quot; &amp;quot;emacs-lisp-mode&amp;quot;)&lt;&#x2F;code&gt; outputs
&lt;code&gt;(&amp;quot;emacs-lisp-mo&amp;quot;)&lt;&#x2F;code&gt;, so it works, hopefully.&lt;&#x2F;p&gt;
&lt;p&gt;So we now have a filterer, all we need is a &lt;code&gt;stream-filter&lt;&#x2F;code&gt;. It would
just take a few lines of code to implement. If in the future we want to
switch from a &lt;code&gt;stream&lt;&#x2F;code&gt; to a &lt;code&gt;list&lt;&#x2F;code&gt; because streams is a bit more
complicated, we will have no reuse and have to replace every instance of
&lt;code&gt;stream-filter&lt;&#x2F;code&gt; and &lt;code&gt;stream-map&lt;&#x2F;code&gt; to &lt;code&gt;-filter&lt;&#x2F;code&gt; and &lt;code&gt;-map&lt;&#x2F;code&gt;. So how do we
abstract the operation over the collection?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;transducers&lt;&#x2F;code&gt;. If you been using &lt;code&gt;map&lt;&#x2F;code&gt;, &lt;code&gt;filter&lt;&#x2F;code&gt;, or &lt;code&gt;reduce&lt;&#x2F;code&gt; in your
code, then &lt;code&gt;transducers&lt;&#x2F;code&gt; allows the trio of operations on most
collection data types such as &lt;code&gt;vector&lt;&#x2F;code&gt;, &lt;code&gt;sequence&lt;&#x2F;code&gt; and more. This is
admittedly another abstraction over the collection that might not be
warranted if you noticed the verbosity of the code but I assure you
there is another benefit we can reap from it.&lt;&#x2F;p&gt;
&lt;p&gt;Well, I am not the authority to talk about it and I just took it from
Rich Hickey&#x27;s explanation of Closure transducer and I might as well have
used an Emacs to Clojure library instead of creating my own. As a
budding lisper, I found the challenge of implementing both &lt;code&gt;stream.el&lt;&#x2F;code&gt;
and &lt;code&gt;transducer.el&lt;&#x2F;code&gt; as a way to improve my elisp coding and
understanding transducers at an implementation level. Transducers are
great and a nice thing to study and use as well as the inspiration from
it. Rolling with &lt;code&gt;transducer.el&lt;&#x2F;code&gt;, let&#x27;s see how it is used.&lt;&#x2F;p&gt;
&lt;p&gt;I urge you to read transducers from Clojure before continuing since I
might not do it justice. What I can show you is a comparison of the
standard and transducing way.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;dash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Mapping
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq xs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2 3 4 5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      mapper &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;number-to-string&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Standard mapping
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map mapper xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 2 3 4 5 6
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Transducer mapping
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map mapper&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reducer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Filtering
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq ys &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2 3 4 5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      filterer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;oddp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Standard filtering
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter filterer ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 1 3 5
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Transducer filtering
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter filterer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reducer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  ys&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Composition
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq zs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2 3 4 5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      mapper &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;1+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      filterer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;evenp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Standard composition
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; We can&amp;#39;t use `-compose&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  filterer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   mapper
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 2 4 6
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Transducer composition
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;composes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map mapper&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter filterer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reducer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So with just plain mapping and filtering, the standard way seem better
too. The time it shines when there is composition of operation, the form
is much more readable and better. This works for streams as promised
with a slight variation.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq xs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 2 3 4 5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      xs&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      mapper &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;1+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      filterer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;evenp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Transducer composition with a stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trgansduce&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;composes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map mapper&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter filterer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As you can see it looks similar with streams and thus everything can be
carried over. Cool. But the most striking of all benefits of a
transducer is that it is lazy or more composable. As a lead, how about
filtering a collection of numbers with two predicates.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq less&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;than&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ten&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      more&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;than&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;five&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; n &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      xs &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;number&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Remember me?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  less&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;than&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ten&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   more&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;than&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;five&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   xs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 6 7 8 9
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What this does is filter the whole collection and then filter again the
smaller collection. Of course, you can optimize this by composing the
predicates so that it would only filter once. However, the composition
of transducers and the laziness of streams, this is already inherent
about it. No need to optimize how the operations interact, it will be
optimized most of the time. This performance benefit alone is why I am
advocating transducers so that majority of the symbol stream can be
skipped and avoid heavily computing the candidates if possible. I think
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Reactive-Extensions&#x2F;RxJS&quot;&gt;RxJS&lt;&#x2F;a&gt; has a better explanation of the optimization the API does when
composing mappings and predicates.&lt;&#x2F;p&gt;
&lt;p&gt;So with that, here is the long awaited candidate rater.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rate&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;search target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;composes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;indexed &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;cons&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-equal &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    search
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What this returns is a single valued stream of a cons pair where the car
is the index of the target function in the sorted candidate list
generated by &lt;code&gt;smex&lt;&#x2F;code&gt;. The index will be our rating: if the target appears
first on the list, the rating would be 0. What we want is a rating of 0
but you can be a bit more loose if you don&#x27;t mind scrolling a bit to
select the command. Since the return value is a stream, you have to
unwrap with preferably &lt;code&gt;stream-to-list&lt;&#x2F;code&gt; and get the first value, just
take note.&lt;&#x2F;p&gt;
&lt;p&gt;So let&#x27;s take all this to one proof.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;checkpoint&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#checkpoint&quot; aria-label=&quot;Anchor link for: checkpoint&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Checkpoint&lt;&#x2F;h2&gt;
&lt;p&gt;With the generator and the rater, we can now make a working code.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Just a simple check if the target function exists.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;null &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Since the result is a list, we have to unwrap it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;partial &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;string-equal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rate&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matcher &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;search&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;size target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; If the function does not exists, return a default stream value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stopped&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let*
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rater &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rpartial &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fb&#x2F;rate-flex-match&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rate&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transduce&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;composes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;search&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;empty&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p search&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length search&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;search&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;size&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; My own filters
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; I prefer the first letter of the candidates be the same as the target
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;search&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-equal
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties search &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties target &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; No separators please
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;search&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;contains&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 search&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; End of my own filters
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;search&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                search
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall rater search&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;null &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; If a candidate was found
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Iff the rating 0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;transducer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;forward&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;permutations target&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      rate&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A little mouthful here but the outline is still the same: given a target
function name, generate all possible substrings, rate them, filter by
the highest rating and then tell me. The other thing here is that there
is &lt;code&gt;search-size&lt;&#x2F;code&gt; which limits the number of substrings to process.
Ideally, you want to type as little as possible so you should set it
near half the length of the target text but open for configuration.&lt;&#x2F;p&gt;
&lt;p&gt;There are other optimizations on my part. One, I would like the candidate and
target to have the first same letter as a hint. For example, with
&lt;code&gt;emacs-lisp-mode&lt;&#x2F;code&gt;, I want my candidates to begin with &lt;code&gt;e&lt;&#x2F;code&gt; so I can
easily remember it as being natural. Two, I would like no command
separator in the candidate because I don&#x27;t type them. You can remove
both if you like.&lt;&#x2F;p&gt;
&lt;p&gt;Regardless of the logic, let&#x27;s try it with the long awaited
&lt;code&gt;emacs-lisp-mode&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rate&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matcher &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;emacs-lisp-mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ema&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Take your pick for =emacs-lisp-mode=
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;emc&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;emp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;eac&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;eas&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;eas&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;eam&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ecs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ecs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ecm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;ecd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;esi&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;esp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;esp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;epm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;epd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Can we go lower?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rate&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matcher &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;emacs-lisp-mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;nil &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; No dice
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Cool, it works. And at this point, you can try this out and walk out. If
you did try this out, you might experience several garbage collection if
you set &lt;code&gt;garbage-collection-messages&lt;&#x2F;code&gt; to &lt;code&gt;t&lt;&#x2F;code&gt; to see how many times. I
don&#x27;t know about you but mine happened a lot but it didn&#x27;t take too much
time but it is indicative of memory issues. Not a biggie but if it
garbage collects, it blocks the UI which is the whole point in the first
place.&lt;&#x2F;p&gt;
&lt;p&gt;However, the one thing we want is that it should not block the UI or be
asynchronous... sort of. Time for the bonus round.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;promises&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#promises&quot; aria-label=&quot;Anchor link for: promises&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Promises&lt;&#x2F;h2&gt;
&lt;p&gt;This is the last piece to build delayed and buffered streams and this
might get hairy as I am running out of documentation. The only
assumption I have for you is that you know how to use &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;JavaScript&#x2F;Reference&#x2F;Global%5FObjects&#x2F;Promise&quot;&gt;promises&lt;&#x2F;a&gt;. Read
about if you don&#x27;t or we can just jump in.&lt;&#x2F;p&gt;
&lt;p&gt;Again if we have a list of a million items, it would still take time
processing all of it. What if we can buffer it by time? Given a time
period and stream, accumulate values into a list until the period is
done. This can be implemented like so.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffered &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;amp;rest args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply stream args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;done &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;now &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply stream args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stop&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stop
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;promise
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;res rej&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elapsed&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;float&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;subtract &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; done&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; elapsed&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stop&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq done &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;push current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value buffered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply stream args&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq elapsed&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;float&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;subtract &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; now&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall res &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reverse buffered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Much in the implementation of a stream but the idea is in
&lt;code&gt;buffered-values&lt;&#x2F;code&gt; and &lt;code&gt;elapsed-time&lt;&#x2F;code&gt; and probably &lt;code&gt;promises&lt;&#x2F;code&gt;. Let&#x27;s see
this with a huge list.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq range &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;number&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 100000&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-from-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list range&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      period &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;30.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; 30fps
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      buffered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffered period stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Your results might vary
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall buffered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; stream-started
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall buffered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 1 ... 4928
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;princ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall buffered&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;;&amp;gt; 4929 ... 9753
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ideally, the combination of this and &lt;code&gt;run-with-idle-timer&lt;&#x2F;code&gt; prevents
blocking the UI. And here comes &lt;code&gt;promise.el&lt;&#x2F;code&gt; or it can be replaced with
the mature &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kiwanami&#x2F;emacs-deferred&quot;&gt;deferred&lt;&#x2F;a&gt; elisp library but the idea here is that it returns a
promise like value when completed returns the number of values
accumulated. Generalizing this.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;temp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;erase&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;letrec &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;time&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffered
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;frame&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rate
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recurser
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall async&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall async&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stop&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Done&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;promise&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-then
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   value
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;values
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;append&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-to-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          values
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;idle&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;timer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;frame&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rate
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      recurser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall recurser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What this does is write the buffered values to a file of a stream. It is
a bit rudimentary since you can&#x27;t stop it once you start it but this is
the main attempt to buffer and asynchronously write values... sort of.
You don&#x27;t need to understand but the idea here is with the promise
stream, you get one value, wait for it to fulfill, write the fulfilled
values, wait for some delay to avoid blocking the UI, get another
promise value and repeat until it is consumed. But let me try it for
you.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;stream
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fb&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rate&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;flex&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;matcher &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;emacs-lisp-mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; After you see the &amp;quot;Done&amp;quot; message
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;contents &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;result&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Output here
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emac
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emas
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emas
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emai
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emai
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emas
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emap
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emam
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emao
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emad
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emad
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emcs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emcs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emci
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emci
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emcs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emcp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emco
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emco
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emc
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emcd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emsl
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emsl
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emsi
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emsp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emsp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emlp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emlp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emis
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emio
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emio
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emid
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; empm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; empm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; empo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; emp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; empd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eacs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eacs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eaci
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eaci
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eacs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eacp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eaco
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eaco
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eac
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eacd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easl
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easl
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easi
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eas
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eals
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eals
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ealm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eais
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eais
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eaim
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eas
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; easd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ease
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eapd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eapd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eamo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eam
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eamd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eame
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eaod
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsl
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsl
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecss
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecss
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecso
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecls
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecls
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eclm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecis
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecis
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecim
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecsm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecso
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecse
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecse
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecpm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecmo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecmo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecmd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecme
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecod
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; ecd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esli
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esli
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esis
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esis
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esip
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esim
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esio
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esi
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esie
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esie
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; espm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; espm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; espo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; espd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elis
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elis
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elid
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elpm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elpm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eisp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eisp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; eipm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; espm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; espm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; espo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; esp
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; espd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; epmo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; epmo
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; epm
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; epmd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; epme
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; epod
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; epd
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It sort of works if you try it, the only thing I can add is to change
the promise delay by higher idle time as well as account for garbage
collection time. However, the idea of non-blocking Emacs might not be
far off but it does take some effort to do so. I do want to stress for
this final leg, that promises or deferred objects are used in
conjunction with streams so that computation time is not noticeable to
appear blocking. Again, the garbage collection looms if you have it
turned on and that the responsiveness takes a dip from time to time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;notes&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notes&quot; aria-label=&quot;Anchor link for: notes&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Notes&lt;&#x2F;h2&gt;
&lt;p&gt;So we achieved our goal of getting the best candidates for flex matched
commands and then toyed around with streams and transducers and a little
bit of promises with inspirations from Clojure and Javascript. I feel
the latter was more fun to experiment on further but I have written too
much now for just a little problem in efficiency. Much ado about nothing.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Analyzing Elisp</title>
          <pubDate>Sat, 27 Aug 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/analyzing-elisp/</link>
          <guid>https://fnlog.dev/dev/analyzing-elisp/</guid>
          <description>&lt;h2 id=&quot;idea&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#idea&quot; aria-label=&quot;Anchor link for: idea&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Idea&lt;&#x2F;h2&gt;
&lt;p&gt;I like poetry. It is art and I love it. I like reading. It is writing
and I love it. So are programmers not writers? Sort of.&lt;&#x2F;p&gt;
&lt;p&gt;Recently, I just read &lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;Your-Code-Crime-Scene-Bottlenecks&#x2F;dp&#x2F;1680500384&quot;&gt;Your Code As A Crime Scene&lt;&#x2F;a&gt; and I am breathless
on what you can do by analyzing source code. It has practical value in
getting a project landscape as well as being smarter on how code
evolves on a project. The concepts such as &lt;strong&gt;coupling&lt;&#x2F;strong&gt;, &lt;strong&gt;churn&lt;&#x2F;strong&gt; and
&lt;strong&gt;ownership&lt;&#x2F;strong&gt; are really compelling. As such, I am planning to implement
a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;code-maater.el&quot;&gt;code-maater.el&lt;&#x2F;a&gt; library so I can practice how to make a major mode in
Emacs as well as get a grip on how to use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;adamtornhill&#x2F;code-maat&quot;&gt;code-maat&lt;&#x2F;a&gt; and its tools.&lt;&#x2F;p&gt;
&lt;p&gt;This motivated me also to analyze Elisp code as a tribute to it and
experiment. My fundamental question is: &lt;strong&gt;is there complexity analysis
in Elisp?&lt;&#x2F;strong&gt; Before you get excited, in all honesty I have no idea what
I am getting at. Merely creating a parser albeit a simple one for lisp
is what drove me here. I&#x27;m good but not that good.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;code-ideas&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#code-ideas&quot; aria-label=&quot;Anchor link for: code-ideas&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Code Ideas&lt;&#x2F;h2&gt;
&lt;p&gt;So here the things I though of when thinking about static Elisp
analysis&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Atom Frequency&lt;&#x2F;strong&gt;
: What atoms are in a file. And probably there frequency.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Expression Complexity&lt;&#x2F;strong&gt;
: Is there a simple metric involving atoms and depth as a way to
measure complexity?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Code Manipulation&lt;&#x2F;strong&gt;
: Can you manipulate the source tree? A common question and concept.&lt;&#x2F;p&gt;
&lt;p&gt;With that in mind, I will need a parser and a project to analyze.
Maybe a shameless plug, I will use my created Elisp parser project
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;elk.el&quot;&gt;elk.el&lt;&#x2F;a&gt; and analyze the source code with it. We programmers love the
meta programming or analysis.&lt;&#x2F;p&gt;
&lt;p&gt;Again, I have no idea what I&#x27;m doing so just enjoy the flow of questions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parser&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#parser&quot; aria-label=&quot;Anchor link for: parser&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Parser&lt;&#x2F;h2&gt;
&lt;p&gt;So while I was a making this parser, I learned how to use &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cask&#x2F;cask&quot;&gt;cask&lt;&#x2F;a&gt; and
&lt;a href=&quot;https:&#x2F;&#x2F;travis-ci.org&#x2F;&quot;&gt;travis-ci&lt;&#x2F;a&gt; to make this project. What I did is to separate the parsing
module against the token analysis library which I dub &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;elk-magic.el&quot;&gt;elk-magic.el&lt;&#x2F;a&gt; and
not another shameless plug.&lt;&#x2F;p&gt;
&lt;p&gt;Since this parser is just something to get me started analyzing source
code, I did not take the terminology of the facts and figures probably
right. I know how to implement the parser using recursion. At this
time, I really don&#x27;t know what it is called or what I am doing. All I
expect is a function that accepts a source code and churns out tokens
in a stream. Such is a functional programmer in me but if I may make
mistakes in terminology or concept, I would be happy to be corrected.
I really just want to see what happens in the source code, I am not
planning to create an interpreter.&lt;&#x2F;p&gt;
&lt;p&gt;Here are some terminology that I came across.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Tokens&lt;&#x2F;strong&gt;
: Everything the source code might be interested in. This is the
main data type expressed as a plist.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Comment&lt;&#x2F;strong&gt;
: Lines starting with &lt;code&gt;; Comment\n&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Whitespace&lt;&#x2F;strong&gt;
: Everything between the tokens&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Text&lt;&#x2F;strong&gt;
: A text or string if you&#x27;d like to call it that &lt;code&gt;&amp;quot;Hello World&amp;quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Atom&lt;&#x2F;strong&gt;
: A symbol or a number, basically what you put in &lt;code&gt;(atom atom atom)&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Quotes&lt;&#x2F;strong&gt;
: The unary expression in Elisp &lt;code&gt;`back-quoting&lt;&#x2F;code&gt;, &lt;code&gt;&#x27;quoting&lt;&#x2F;code&gt; or &lt;code&gt;#&#x27;function-quote&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Expressions&lt;&#x2F;strong&gt;
: The s-exp of the source code, recursion is prevalent here.&lt;&#x2F;p&gt;
&lt;p&gt;I am aware that &lt;strong&gt;Numbers&lt;&#x2F;strong&gt; are not in the list but I do not care about
the actual data type for this analysis. One could put a mapper on the
tokens just to analyze what data type an atom would be but I am
interested in the syntax tokens rather than what they really are and I
know that is more complicated I needed.&lt;&#x2F;p&gt;
&lt;p&gt;Honestly, you don&#x27;t need to care about the problems when I implemented
the parser but for those interested.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Character Escaping&lt;&#x2F;strong&gt;
: Handling &lt;code&gt;\&lt;&#x2F;code&gt;, &lt;code&gt;?&lt;&#x2F;code&gt; or &lt;code&gt;?\&lt;&#x2F;code&gt; made this project harder to implement
but should have expected that.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Infinite Recursion&lt;&#x2F;strong&gt;
: Sometimes the code hangs when there is an error recursively
tokenizing the code. Unit testing and modularity would have
helped me a lot in my development time&lt;&#x2F;p&gt;
&lt;p&gt;And probably more but those two I should have considered while I was
thinking about it. Beside that, implementation of a recursive parser
is easy enough but obviously not perfect. After creating the unit
tests, I am confident enough that it parses source code 90% of the
time.&lt;&#x2F;p&gt;
&lt;p&gt;As an experiment, I tried parsing &lt;code&gt;alert&lt;&#x2F;code&gt;, &lt;code&gt;helm-projectile&lt;&#x2F;code&gt;,
&lt;code&gt;prodigy&lt;&#x2F;code&gt; and my own source code and it doesn&#x27;t hang and gets it
right. So with this meaningless parser prelude, let&#x27;s get into the
meat of the topic. Source code analysis. All experimental source code
is in &lt;code&gt;elk-magic.el&lt;&#x2F;code&gt; with the tag &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;elk-magic.el&#x2F;tree&#x2F;analyzing-elisp-post&quot;&gt;analyzing-elisp-post&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;atom-frequency&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#atom-frequency&quot; aria-label=&quot;Anchor link for: atom-frequency&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Atom Frequency&lt;&#x2F;h2&gt;
&lt;p&gt;Let&#x27;s start with a simple list.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;a b c a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The main parsing function, &lt;code&gt;elk-parse&lt;&#x2F;code&gt;, will yield the hypothetical
list of tokens or plists. The structure should be evident or reflect
lisp itself with some extra annotation.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;(a b c)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Too lazy to pretty it properly
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:type expression
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        :tokens
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:type atom
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :tokens
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :end&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :index
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :level
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :data&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;type
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:type whitespace
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :tokens
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :end&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :index
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :level
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:type atom
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :tokens
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :end&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :index
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :level
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :data&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;type
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:type whitespace
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :tokens
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :end&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :index
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :level
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:type atom
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :tokens
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :end&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :index
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :level
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :text
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                :data&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;type
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        :start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        :end&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        :index
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        :level
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        :id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        :parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;id
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Take your time in guessing the structure of the token because it takes
too much time to explain. I do want to point your attention to the
plists with type &lt;code&gt;&#x27;atom&lt;&#x2F;code&gt;. Given this structure, how do we get all the
tokens in this list. Do think about it while I present the first code
from &lt;code&gt;elk-magic.el&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk--select-type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;type tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Filter tokens by a specified type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compose
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;partial &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;-filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;eq &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk--flatten-tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk--extract-atoms &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Get atoms in tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compose
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;partial &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;-map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;rpartial &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;plist-get&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;partial &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk--select-type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;atom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;extract&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atoms &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;(a b c)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Using the functional style of recursion and mapping, I traverse the
tree and get the source code text and the function does return an
expected list that reflects the actual structure of the code. But this
is not exciting. As promised, let&#x27;s apply this to &lt;code&gt;elk.el&lt;&#x2F;code&gt;. Here is
the output while I group and sort it by frequency.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defconst elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;FrancisMurillo&#x2F;elk.el&#x2F;analyzing-elisp-post&#x2F;elk.el&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defconst elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&#x2F;Downloads&#x2F;elk.el&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;f&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magic&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atoms &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; So here is the token frequency
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;61&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--use-stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;37&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;defun&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;34&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;32&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;29&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;letter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;27&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;current-char&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;25&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;24&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;24&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;this-char&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;23&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;setf&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;22&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lambda&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;18&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;start-pos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;18&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;recurser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;18&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;17&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;sub-tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;14&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;13&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;12&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;incremented-index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;not&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-copy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;stop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--create-token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;8&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;end-pos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;letrec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;new-token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;marked-token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lexical-let&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;quote-text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;expression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;pcase&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;require&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;current-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&amp;amp;optional&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;base-value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--stream-next-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--quote-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;next-char&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--dispatch-stream-consumers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-map&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;leveled-token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;seed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;indexed-token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--text-stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;current-text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;text-length&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;increment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;peek&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:end-pos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--whitespace-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--text-quote-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--text-escape-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--letter-escape-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--atom-letter-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;start-letter&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;expression-tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;generator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;texify&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk-current-tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--stream-consumers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--consume-whitespace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--consume-comment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--consume-text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--consume-quote&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--consume-atom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--consume-expression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;base&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;incrementer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--stream-stop-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:start-pos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--comment-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--newline-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--function-quote-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--back-quote-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--expression-start-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--expression-close-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;whitespace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;comment&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;base-token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:quote-text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;handler&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--attach-source&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--attach-level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--attach-token-id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;incremental-sequence&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;parent-id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--attach-expression-index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--attach-atom-type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;typer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;number&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--parsing&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;parsing&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-compose&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-partial&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;text-tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;source-text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;cl-lib&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;dash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;dash-functional&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;defgroup&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:group&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;tools&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;url-link&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:tag&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--started-stream&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;s-matches-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;unless&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:parent-id&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-map-indexed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:index&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;zerop&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;symbol&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;:data-type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk--codify&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;s-join&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-flatten&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elk-parse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;region-active-p&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A lot of tokens indeed! So the question is: &lt;strong&gt;what does this tell us?&lt;&#x2F;strong&gt;
First of, there is already a lot of junk such function
parameters(&lt;code&gt;:level&lt;&#x2F;code&gt;, &lt;code&gt;&amp;amp;optional&lt;&#x2F;code&gt;), numbers(&lt;code&gt;0&lt;&#x2F;code&gt;, &lt;code&gt;1&lt;&#x2F;code&gt;) and other known
functions(&lt;code&gt;defun&lt;&#x2F;code&gt;, &lt;code&gt;not&lt;&#x2F;code&gt;). So to say this is expected but again what
does it mean for a token to be frequent or otherwise?&lt;&#x2F;p&gt;
&lt;p&gt;Honestly, I don&#x27;t know. I do want to know what keywords best identify
a source code. I guess I am merely grasping at straws here. I could
tighten up the filter for what is a meaningful atom but I could still
run in the same problem.&lt;&#x2F;p&gt;
&lt;p&gt;An unoriginal idea would be to create an linter on what keywords or
names should be allowed such as enforcing a schema but I don&#x27;t want to
go there.&lt;&#x2F;p&gt;
&lt;p&gt;So first idea is a bust.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;expression-complexity&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#expression-complexity&quot; aria-label=&quot;Anchor link for: expression-complexity&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Expression Complexity&lt;&#x2F;h2&gt;
&lt;p&gt;This is another wild idea but the gist is that &lt;strong&gt;given an s-exp, is
there a metric to compute complexity?&lt;&#x2F;strong&gt; I am not computer science
professor but a simple metric can go like this and remember atoms have
a level property.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk-magic--token-depth &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Find out the TOKEN depth or the maximum number of level it has.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;letrec &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recurser
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;level &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;depths
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map recurser sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;depths
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;depths&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall recurser token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk-magic--token-atoms &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Find out the TOKEN child atoms up to the last depth.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;letrec &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;recurser
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;type &amp;#39;atom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;append &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map recurser sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall recurser token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk-magic--token-complexity &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Compute expression or TOKEN complexity.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atoms &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magic&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atoms token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;level &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;complexity &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;float &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length atoms&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sum
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;depth &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;- &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get atom :level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; root&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;depth&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;complexity depth&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;complexity depth&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;complexity&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           atoms&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In short, the sum of &lt;code&gt;((&#x2F; number-of-tokens) * (&#x2F; current-atom-level main-expression-level))&lt;&#x2F;code&gt;. The idea is weighted atom levels. By giving
each atom a weight based on the number of atoms in total and factoring
in on how nested that atom is, it should be a good guess of
complexity. I guess. So for a quick gist, let&#x27;s apply it to the
snippet above.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Code from above
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defconst snippet&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;code &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;region&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;beginning&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;region&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk-magic--token-complexity &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse snippet&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;code&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; 0 are the whitespace, whitespace has no complexity or is there?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6.357142857142854 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; elk-magic--token-depth
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;6.599999999999997 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; elk-magic--token-atoms
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;5.727272727272726 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; elk-magic--token-complexity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Again what does a 5 or 6 tell us? We need more context.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A normal list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk-magic--token-complexity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;(1 2 3 4)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk-magic--token-complexity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&amp;#39;a-regular-atom&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Baseline
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A require
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk-magic--token-complexity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;(require &amp;#39;elk)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1.5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A normal function
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk-magic--token-complexity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;(defun hello-elk () (interactive) (message &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Hello Elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1.5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; A battle of recursion
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;subr&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk-magic--token-complexity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-trim&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;(defun factorial-linear (n)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  (interactive)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  (let ((value 1)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;        (counter 1 ))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    (while (&amp;lt;= counter n)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      (setf value (* value counter))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;      (setf counter (1+ counter)))))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3.6363636363636376&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Impretive is not that complicated
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk-magic--token-complexity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-trim&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;(defun factorial-recursive (n)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  (interactive)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  (if (zerop n) 1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    (* n (factorial-recursive (1- n))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  )&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2.769230769230769&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Functional is less complicated!?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Very nested
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cl&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prettyprint &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;elk-magic--token-complexity
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-trim&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;left &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;(1 (2 (3 (4 (5 (6 (7 (8 (9 (10 (11 (12 (13 (14 (15 (16))))))))))))))))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Result
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;8.5&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Complicated indeed
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So the results are more encouraging than the previous but again what
does this tell us? I still don&#x27;t know but here is what I think.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If it is around 1 to 5&lt;&#x2F;strong&gt;, the code is considered &lt;strong&gt;simple&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;If it is around 6 to 8&lt;&#x2F;strong&gt;, the code is &lt;strong&gt;non-trivial&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Anything higher than 8&lt;&#x2F;strong&gt;, the code is &lt;strong&gt;complex&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The case may vary and no one can really say if the code should be
complex or simple, that is in experience but having a simple metric is
kinda nice. I do want to say that this metric has its flaws and can be
faked but again it is nice. One can compute the average complexity of
a code and then track it over time or simply get the a static
complexity landscape. Or one can just do an ocular and say this code
needs refactoring. Nothing beats experience I think.&lt;&#x2F;p&gt;
&lt;p&gt;Quite encouraging for a simple experiment. I say as well that this
might beat whitespace analysis if people prefer condensed code. I
don&#x27;t know but for now this is good.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;code-manipulation&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#code-manipulation&quot; aria-label=&quot;Anchor link for: code-manipulation&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Code Manipulation&lt;&#x2F;h2&gt;
&lt;p&gt;If you have the syntax tree then you can manipulate it, right? This is
the common use of a syntax tree but can also be used as a formatter
but Elisp already has this. I can give two trivial examples which
kinda makes this implementing in a more Emacs way fun.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Nearest top level expression at point&lt;&#x2F;li&gt;
&lt;li&gt;Manipulating the code&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The first one is very easy.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk-magic--nearest-top-expression-at-point &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Get token expression that is nearest to the highest point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse source&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expression&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;first &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;eq &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;expression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;lt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :end&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                   tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; expression&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;goto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;char &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get expression&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token :start&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;No near top level expression at point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Complexity: 6.377777777777779 (Non-trivial)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Just simply parse the code, filter the highest level expressions with
the ones between the point, and simply point at the &lt;code&gt;start-pos&lt;&#x2F;code&gt;. The
sad thing is that if the code is large this has to parse the whole
code just to figure out where to land. There is an easier way with
&lt;code&gt;paredit&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;paredit--nearest-top-level-expression-at-point &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Above but using paredit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;condition&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-case&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; ex
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;while t &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;paredit&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;backward&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;up&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;#39;error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Complexity: 2.5(Simple)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Even, the complexity metric says this. Wow... just goes to show Emacs
rocks. You don&#x27;t need the syntax tree just to move around the code.
But how about something more juicy but not really useful&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s say we have this snippet.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;x &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar y &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Nothing special right? Yeah. For the sake of example, how about we
want to namespace it... say with &lt;code&gt;z&lt;&#x2F;code&gt;? Let&#x27;s use the syntax tree.&lt;&#x2F;p&gt;
&lt;p&gt;This be way harder than just doing a macro replace, I am not selling
myself that much huh?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;namespacer &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;namespace&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;code &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-min&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;raw&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parse source&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;code&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magic&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;create&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;table raw&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;just&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;magic&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;discard&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filler raw&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expression&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get expression :tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;nth &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;nth &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; sub&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get header&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom :text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get name&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom :text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-equal header&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;defun&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string-equal header&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;defvar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expressions
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;eq &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :type&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;expression&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :level&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expression&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;p token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        just&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interace&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atoms
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;nth &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get token :tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;get interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom :text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat namespace interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;plist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;put interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;atom :text new&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        interface&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expressions&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;elk&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;codify raw&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;tokens&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;; Complexity: 7.2065217391304355(Non-trivial?)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The code is indeed complicated but it works. Applying it to this code
with &lt;code&gt;(namespace &amp;quot;my-namespace-&amp;quot;)&lt;&#x2F;code&gt;, would prefix namespacer with
&lt;code&gt;my-namespace-namespacer&lt;&#x2F;code&gt;. I could paste the code but would be merely
a one line change.&lt;&#x2F;p&gt;
&lt;p&gt;The sad thing is that you can do this with a macro and probably be
safer but this shows how you can manipulate the code using the tokens.
This is more of a PoC than anything else. There is too much boiler
plate just to change the function name, there might be a better
paradigm. &lt;a href=&quot;http:&#x2F;&#x2F;esprima.org&#x2F;&quot;&gt;Esprima&lt;&#x2F;a&gt; anyone?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;So nothing much to be impressed... for now. I haven&#x27;t finished the
book yet but now I have a tool to apply some analysis for Elisp. I&#x27;m
still looking for ideas about analyzing code at face, not by context.
Code analysis has been done too much, what I am looking at is how code
can be analyzed as a paragraph or as a poem. Automatic summarization
and language processing, is there an analogy for code? We have code
generation and other stuff but how about things that tell you about
the structure or abstract.&lt;&#x2F;p&gt;
&lt;p&gt;Maybe I am talking in riddles but I can say this is a fun project
although will little returns. Hmm... I wonder what else I can analyze
about the tokens or there proximity.&lt;&#x2F;p&gt;
&lt;p&gt;I am a writer. I am a coder. I am a writer and a coder&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Summarizing My Articles</title>
          <pubDate>Sat, 13 Aug 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/summarizing-my-articles/</link>
          <guid>https://fnlog.dev/dev/summarizing-my-articles/</guid>
          <description>&lt;h2 id=&quot;problem&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#problem&quot; aria-label=&quot;Anchor link for: problem&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Problem&lt;&#x2F;h2&gt;
&lt;p&gt;Good news, I was able to make my &lt;a href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;GnusTutorial&quot;&gt;gnus&lt;&#x2F;a&gt; work, now I can read emails
easily, productively and in &lt;code&gt;Emacs&lt;&#x2F;code&gt;. Now I am trigger happy starring
and watching &lt;code&gt;GitHub&lt;&#x2F;code&gt; repos, I am the observer, the watcher.&lt;&#x2F;p&gt;
&lt;p&gt;Bad news, I have 300 emails coming every day specially from the
popular repos such as &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;facebook&#x2F;react-native&quot;&gt;react-native&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;syl20bnr&#x2F;spacemacs&quot;&gt;spacemacs&lt;&#x2F;a&gt; which gets a lot of
issue traffic. Nothing new and expected, but having ideas in improving
the information processing is a good thing.&lt;&#x2F;p&gt;
&lt;p&gt;Thankfully, the email reader allows me to sift through it rather quick
but I do lament that I might be missing something due to the speed I
am glancing at each issue. So I remembered something.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Is there a text summarization tool?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Of course there is, if a tool can help me understand quicker a long
discussion or issue, then profit. So here is my experience tying up a
text summary tool &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;miso-belica&#x2F;sumy&quot;&gt;sumy&lt;&#x2F;a&gt; and how I bind it with &lt;code&gt;gnus&lt;&#x2F;code&gt;. For those
impatient, here is my working snippet for this task. Not perfect yet,
but I might go back once I learn more. You can find this in my &lt;code&gt;.gnus&lt;&#x2F;code&gt;
configuration but that is somewhat private, so here it is.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;deferred&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defconst fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cache&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Where you keep your moving files&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defconst fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expand&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cache&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Summary temporary file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Get current article buffer message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog2 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;goto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;end &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog2 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;goto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;signature&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties start end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Summarize text for easier comprehension&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;temp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:nextc
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;shell &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;sumy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lex-rank&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--file=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;The previous request made, this is to prevent extra request being made.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;This can be made into a function is so desired&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Show a summary for each article I visit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:cancel fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request summary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:$
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      summary
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:nextc it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarization&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; summarization&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                       summarizies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Summarizing article&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;goto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eoh&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Summary:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-------&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:nextc it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prepare&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;gnus-article-summary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So what this does is whenever I open an article, I call &lt;code&gt;sumy&lt;&#x2F;code&gt; on the
message and I get an list of sentences that are important to read.
I then hack a little summary on top of the message or before the
content to show me.&lt;&#x2F;p&gt;
&lt;p&gt;I could have used other tools or other features of &lt;code&gt;gnus&lt;&#x2F;code&gt; such as
&lt;code&gt;adaptive scoring&lt;&#x2F;code&gt; or done it in a better way or what have you but
this is good enough.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-tool-and-the-glue&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-tool-and-the-glue&quot; aria-label=&quot;Anchor link for: the-tool-and-the-glue&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
The Tool And The Glue&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;m more of a &lt;code&gt;python&lt;&#x2F;code&gt; guy and I&#x27;ve heard some &lt;code&gt;NLTK&lt;&#x2F;code&gt;, so &lt;strong&gt;duck duck
go, what python text summary tool is nice to use?&lt;&#x2F;strong&gt; After a few
searches and experiments, &lt;code&gt;sumy&lt;&#x2F;code&gt; looks like a good enough command line
tool. So what is good enough?&lt;&#x2F;p&gt;
&lt;p&gt;I have no idea what the algorithms are but with some experimentation
and reading, I used the &lt;a href=&quot;http:&#x2F;&#x2F;tangra.si.umich.edu&#x2F;%257Eradev&#x2F;lexrank&#x2F;lexrank.pdf&quot;&gt;lex-rank&lt;&#x2F;a&gt; algorithm which is focused on
central sentences. Easy enough to understand, I suppose.&lt;&#x2F;p&gt;
&lt;p&gt;So how do we tie it up? First is getting the message from the article
buffer. I was hoping for an &lt;code&gt;gnus-article-message&lt;&#x2F;code&gt; function or
something but apparently even the code doesn&#x27;t clearly have it. Here
is what I came up with.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Get current article buffer message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;start &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog2 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;goto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;end &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prog2 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;goto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;signature&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;point&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;substring&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;no&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;properties start end&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As you can see, it uses buffer magic and some tinkering. Now how
do we plug it in the tool? I hoped for an easy piping with the tool
but it uses files instead, a little tangle. I filed an &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;miso-belica&#x2F;sumy&#x2F;issues&#x2F;66&quot;&gt;issue&lt;&#x2F;a&gt; but it
can tied with this simple snippet.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defconst fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;expand&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cache&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Summary temporary file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Summarize text for easier comprehension&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;temp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:nextc
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:process&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;shell &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;sumy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;lex-rank&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--file=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;right summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here I use the nice &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kiwanami&#x2F;emacs-deferred&quot;&gt;deferred&lt;&#x2F;a&gt; library to make an shell command and
return a deferred as well. Why deferred? Asynchronous or non-blocking
operation. You can use &lt;code&gt;shell-command-to-string&lt;&#x2F;code&gt; and make it
synchronous, but when you&#x27;re reading a lot of email; the wait time is
compounded. With &lt;code&gt;deferred:process-shell&lt;&#x2F;code&gt;, it is non-blocking and easy
enough to use than &lt;code&gt;make-process&lt;&#x2F;code&gt; or &lt;code&gt;start-process&lt;&#x2F;code&gt;. Like a
&lt;code&gt;promise&lt;&#x2F;code&gt;, I process the raw string output into a list of sentences.
Easy enough.&lt;&#x2F;p&gt;
&lt;p&gt;So how do we tie this in with &lt;code&gt;gnus&lt;&#x2F;code&gt;?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gnus-article&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#gnus-article&quot; aria-label=&quot;Anchor link for: gnus-article&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Gnus Article&lt;&#x2F;h2&gt;
&lt;p&gt;This is the sad part for me, I hacked the buffer content manually. I
first tried &lt;code&gt;font-lock&lt;&#x2F;code&gt; which sort of works but not consistent... yet.
I did try manipulaintg &lt;code&gt;gnus-emphasis-alist&lt;&#x2F;code&gt; but no dice. After so
many hacks, that&#x27;s what I did. This snippet should explain all.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;The previous request made, this is to prevent extra request being made.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;This can be made into a function is so desired&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Show a summary for each article I visit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:cancel fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request summary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:$
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      summary
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:nextc it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarization&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; summarization&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                       summarizies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Summarizing article&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;goto&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;eoh&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; I feel this is evil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Summary:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;-------&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;insert &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;only&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:nextc it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from wrapping the main function with keeping tabs of the current
summary, the core of the message can be seen in the
&lt;code&gt;gnus-with-article-buffer&lt;&#x2F;code&gt;. It just adds a small summary section right
before the message begins and since the whole operation is
asynchronous, you have to blink before you see the result. Give or
take, making the section is not that hard nor how the deferred or
promise continuation and housekeeping is implemented. It is pretty
straightforward code.&lt;&#x2F;p&gt;
&lt;p&gt;I do lament using &lt;code&gt;read-only-mode&lt;&#x2F;code&gt; which breaks the contract of being
immutable. There is a correct mode for this which is
&lt;code&gt;gnus-article-edit-mode&lt;&#x2F;code&gt; but this modifies the backing value. What we
need is simply a display aid. I do pray I find the more legit way of
doing this but for now, this does show a summary.&lt;&#x2F;p&gt;
&lt;p&gt;This is harder than it looks and I mulled this over for hours.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;limitation&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#limitation&quot; aria-label=&quot;Anchor link for: limitation&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Limitation&lt;&#x2F;h2&gt;
&lt;p&gt;As the astute read, sometimes the summary isn&#x27;t helpful or redundant&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;summarizing-my-articles&#x2F;summary-snapshot.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;This is a common thing, you can&#x27;t expect a machine to understand what
you want. The screenshot above shows that the summary might be the
same as the email you are reading and in that case, the summary is
redundant and sadly useless. Obviously, the case amplifies when there
is code where a text processor cannot understand.&lt;&#x2F;p&gt;
&lt;p&gt;But I did come up with a long issue email, where the summary really
did show the points I am interested in. I am not looking for the
perfect tool, just something that is good enough without sacrificing
too much. As long as I get a good summary after skimming through the
text, if the summary help then it is a bonus.&lt;&#x2F;p&gt;
&lt;p&gt;Again, it is not perfect but it is okay.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;So with a shiv of a email text analysis, maybe we can do better?
Perhaps, once I learn more and update this code. But text analysis is
pretty interesting. Emails, buffers, or maybe diary journals? I maybe
scratching the surface here and not showing the true strength, but the
idea is there. Text analysis for email reading. Maybe someone can do a
better job?&lt;&#x2F;p&gt;
&lt;p&gt;As for now, time to check my mail.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2016-08-13-update&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#2016-08-13-update&quot; aria-label=&quot;Anchor link for: 2016-08-13-update&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
2016-08-13 Update&lt;&#x2F;h2&gt;
&lt;p&gt;I got obsessive about the code so here is a revised edition of the
core code that does it appropriately.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;dash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defface fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aid&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face  &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:weight bold :height &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;1.1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :box &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;:line&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;width &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :color &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;grey75&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; :style released&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;button&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Article aid face&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aid&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aid&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Article aid var&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defvar fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;The previous request made, this is to prevent extra request being made.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;    This can be made into a function is so desired&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Show a summary for each article I visit&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:cancel fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarize&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request summary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:$
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      summary
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:nextc it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizies summarizies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emphasis&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alist
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;regexp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;quote summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                &amp;#39;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aid&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             summarizies&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emphasis&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alist&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Emphasizing article aids&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emphasize&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;with-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emphasis&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alist
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;filter &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emphasis&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;eq &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;nth &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96a5d9;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; emphasis&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;aid&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;face &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;emphasis&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alist&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;deferred:nextc it
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summarizing&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;request &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &amp;#39;gnus&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;article&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prepare&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;gnus-article-summary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here is a screenshot of this new snippet&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;summarizing-my-articles&#x2F;article-emphasized.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Not the best screenshot but what this snippet does is emphasize and
highlight key sentences. The correct way of emphasizing an article
with &lt;code&gt;gnus&lt;&#x2F;code&gt; is with &lt;code&gt;article-emphasize&lt;&#x2F;code&gt; and I homed in on that.&lt;&#x2F;p&gt;
&lt;p&gt;Ideally, you just add to the list &lt;code&gt;gnus-article-emphasis-alist&lt;&#x2F;code&gt;
phrases you want emphasized. Obvious enough, but the first problem I
came across is that it wasn&#x27;t working even with the simplest
configuration. After two hours of useless mutations, I checked the
code for &lt;code&gt;article-emphasize&lt;&#x2F;code&gt; which is quite deceptive.&lt;&#x2F;p&gt;
&lt;p&gt;Long story short, you have to mutate it within the
&lt;code&gt;gnus-summary-buffer&lt;&#x2F;code&gt; and call &lt;code&gt;article-emphasize&lt;&#x2F;code&gt; on
&lt;code&gt;gnus-article-buffer&lt;&#x2F;code&gt; which is weird or have I not read the manual
enough? Probably the latter but with that out of the way, the code
followed.&lt;&#x2F;p&gt;
&lt;p&gt;I do admit the hacked code is a little annoying that it pushed down
the text I was reading from time to time, so this correct code is much
better. Sadly there is an extra requirement, &lt;code&gt;dash&lt;&#x2F;code&gt;, and the weird
&lt;code&gt;with-current-buffer&lt;&#x2F;code&gt; juggling and state management of
&lt;code&gt;gnus-article-emphasis-alist&lt;&#x2F;code&gt; so that it doesn&#x27;t stack up during
prolonged use.&lt;&#x2F;p&gt;
&lt;p&gt;Well, state. Maybe a macro can do this but I don&#x27;t know which one yet.
Whatever. And now I can definitely get back to reading my mail.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;minor-reflection&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#minor-reflection&quot; aria-label=&quot;Anchor link for: minor-reflection&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Minor Reflection&lt;&#x2F;h2&gt;
&lt;p&gt;By the way, there has been research in using machine learning and
automatic summarization with emails which is pretty cool. I wonder how
that can apply to reading source code instead of plain text? I&#x27;m not
hoping for too much but still pretty nice to think about all the
things you can analyze with a tool.&lt;&#x2F;p&gt;
&lt;p&gt;Currently, I&#x27;m using &lt;a href=&quot;http:&#x2F;&#x2F;conkeror.org&#x2F;&quot;&gt;conkeror&lt;&#x2F;a&gt; as my browser which is extensible and
can run shell commands. What this means is that I can run &lt;code&gt;sumy&lt;&#x2F;code&gt; and
plugin the current url which will give me a summary output of the
current page. Basically, an article summary in one command. Here is my
rookie snippet.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;javascript&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-javascript &quot;&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;io&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;spawn-process&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;interactive&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;interactive(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;gist&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;What is this webpage all about?&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;, &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;I&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;I&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current_uri&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;spec&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sumy_cmd &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;home&#x2F;fnmurillo&#x2F;.local&#x2F;bin&#x2F;sumy&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cmd_str &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;sumy_cmd &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt; lex-rank --length 5 --url &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;url &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        I&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;window&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;minibuffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Shell Command: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cmd_str)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;var &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;output &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= yield &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;shell_command(
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            cmd_str&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            $fds &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;[
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    output&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async_binary_string_writer(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async_binary_reader(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        data &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                              )
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;},
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    input&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;async_binary_reader(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) {
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        error &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;s &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;|| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                                              )
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            ]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        )&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        I&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;window&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alert (
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Here&amp;#39;s The Gist&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;--------&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                data
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;trim()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;function &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff694d;&quot;&gt;summary&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) { &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39; &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;+ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;summary &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It looks dirty because, but the key points is the &lt;code&gt;shell_command&lt;&#x2F;code&gt; and
&lt;code&gt;alert&lt;&#x2F;code&gt; which pretty much is just calling the tool and displaying with
the poor man&#x27;s dialog box. Still learning and probably will go back
once I learn more, this is for your enjoyment.&lt;&#x2F;p&gt;
&lt;p&gt;So with that, let me see what the tool says about this article. Kinda
meta which pretty much reflections.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;summarizing-my-articles&#x2F;article-gist.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;Huh... looks very hopeful. What do you think? Does this represent the
article you read? One thing, was it helpful? There is definitely some
use with an information processing tool at your fingertip.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>An Unique Projectile Completion</title>
          <pubDate>Tue, 02 Aug 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://fnlog.dev/dev/an-unique-projectile-completion/</link>
          <guid>https://fnlog.dev/dev/an-unique-projectile-completion/</guid>
          <description>&lt;h2 id=&quot;idea&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#idea&quot; aria-label=&quot;Anchor link for: idea&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Idea&lt;&#x2F;h2&gt;
&lt;p&gt;I cannot live without &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bbatsov&#x2F;projectile&quot;&gt;projectile&lt;&#x2F;a&gt; and probably &lt;a href=&quot;https:&#x2F;&#x2F;emacs-helm.github.io&#x2F;helm&#x2F;&quot;&gt;helm&lt;&#x2F;a&gt; and
&lt;code&gt;projectile-find-files&lt;&#x2F;code&gt;  is my bread-and-butter command. But they say,
&lt;em&gt;familiarity breeds contempt&lt;&#x2F;em&gt; and once you been using it so much; you
want some customization. But which part? For my contempt, I really just
want to change how the &lt;code&gt;helm-completion&lt;&#x2F;code&gt; buffer displays the options.&lt;&#x2F;p&gt;
&lt;p&gt;What I really want is rather to &lt;strong&gt;display the filename in the front&lt;&#x2F;strong&gt; and
&lt;strong&gt;display the file path in reverse order&lt;&#x2F;strong&gt; since my eyes naturally scan
from left to right. And so if you want proof of how this looks like to
me, I used the &lt;code&gt;projectile-find-files&lt;&#x2F;code&gt; on my &lt;code&gt;emacs&lt;&#x2F;code&gt; directory and this
is what it looks like with just &lt;code&gt;helm&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;an-unique-projectile-completion&#x2F;helm-completion.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;After some hacking and discussion, this is what I settled on.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;an-unique-projectile-completion&#x2F;customized-completion.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;So if you think this is weird or offensive, feel free to do something
more meaningful in your life. But if you are curious, keep reading.&lt;&#x2F;p&gt;
&lt;p&gt;Or if you just want to know the code, here it is for your consumption.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;dash&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;require &amp;#39;f&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;custom&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;helm&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;completion &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prompt choices&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Just a custom helm completion for projection&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let*
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;separator &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;notation
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pieces &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reverse fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pieces&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;relative&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path relative&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;               &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;relative&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split relative&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;drop&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;last &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length split&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;relative&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;ish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;listp ish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                      ish &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons ish ish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;swap&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall f &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-as-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;label
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pairs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;labels
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;cdr&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pairs&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lengths
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compose
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;length
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                            fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;notation&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           labels&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;max-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;length
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;apply &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;max&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; label&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lengths&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;label&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%-s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%-s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;formatter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;concat
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format label&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format name&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  |-&amp;gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format description&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;format description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;  &amp;lt;-|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;            &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let*
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;unique&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;full&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall relative&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             full&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             unique&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;notation unique&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;description
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;notation parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;label
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;formatter
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;name
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                             display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons display&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;label &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;refined&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;choices &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;uniquify&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alist choices&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;mapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;choices
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compose
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;funcall pair&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-as-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;label refined&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;choices&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 swap&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                 &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;as-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                refined&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;choices&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;helm&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read prompt mapped&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;choices
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                    :must&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match &amp;#39;confirm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;completion&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;system &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;fn&#x2F;custom-helm-completion&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I admit the code looks long, but I think it follows my functional
and aesthetic instincts.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;beginning&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#beginning&quot; aria-label=&quot;Anchor link for: beginning&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Beginning&lt;&#x2F;h2&gt;
&lt;p&gt;As you can see from the screenshot taken with the useful &lt;code&gt;emacsshot&lt;&#x2F;code&gt;,
it focuses on the filename rather than the whole path. This reminds
when I used &lt;a href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;InteractivelyDoThings&quot;&gt;ido&lt;&#x2F;a&gt; with flex matching, the search is more tuned with
the filename which I still miss although &lt;code&gt;helm&lt;&#x2F;code&gt; is different in this
regard, a small concession would be nice. So thus my journey of
modifying the completion.&lt;&#x2F;p&gt;
&lt;p&gt;Actually, I just wanted to see the filename but the joy of exploring
the project structure might be lost if I don&#x27;t include the whole path
but optional. So let&#x27;s start with the primary feature: filenames.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;filenames&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#filenames&quot; aria-label=&quot;Anchor link for: filenames&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Filenames&lt;&#x2F;h2&gt;
&lt;p&gt;Seems easy enough with the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;f.el&quot;&gt;f&lt;&#x2F;a&gt; library and &lt;code&gt;f-filename&lt;&#x2F;code&gt; function. So
let&#x27;s see how this factors in with &lt;code&gt;projectile-current-project-files&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;out &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapc &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;out &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;files&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Trimmed output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elisp&#x2F;custom-zone&#x2F;zone-end-of-buffer.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elisp&#x2F;custom-zone&#x2F;zone-waves.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; .gitignore
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; .projectile
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; README.org
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; config.or
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elisp&#x2F;promise&#x2F;.gitignore
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elisp&#x2F;promise&#x2F;LICENSE
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elisp&#x2F;promise&#x2F;promise-test.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; elisp&#x2F;promise&#x2F;promise.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; init-standard.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; init.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; personal.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapc &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;compose &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;out &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;f-filename&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;files&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; zone-end-of-buffer.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; zone-waves.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; .gitignore
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; .projectile
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; README.org
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; config.org
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; .gitignore
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; LICENSE
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; promise-test.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; promise.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; init-standard.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; init.el
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; personal.el
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That was easy, but the astute reader will notice that there are two
&lt;code&gt;.gitignore&lt;&#x2F;code&gt; files, one from my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;.emacs.d&quot;&gt;.emacs.d&lt;&#x2F;a&gt; and one from my shiv
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FrancisMurillo&#x2F;promise.el&quot;&gt;promise.el&lt;&#x2F;a&gt; implementation. This raises the question: &lt;strong&gt;if there are
files with the same name, how do you differentiate between the two?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Well &lt;code&gt;Emacs&lt;&#x2F;code&gt; already has a nice term for this with buffers and its
&lt;a href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;uniquify&quot;&gt;uniquify&lt;&#x2F;a&gt;. The idea to resolve this is to add the least many parents to
make them unique and thankfully &lt;code&gt;f&lt;&#x2F;code&gt; already implements this with
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;f.el#f-uniquify-alist-paths&quot;&gt;f-uniquify-alist&lt;&#x2F;a&gt; so one does not need to worry about it. Crisis
averted.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapc &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;out  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;uniquify&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alist &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;files&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Trimmed output
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;custom-zone&#x2F;zone-end-of-buffer.el . zone-end-of-buffer.el)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;custom-zone&#x2F;zone-waves.el . zone-waves.el)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (.gitignore . &#x2F;.gitignore)  ;; &amp;lt;-- The first gitignore
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;promise&#x2F;.gitignore . promise&#x2F;.gitignore)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (.projectile . .projectile)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (README.org . README.org)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (config.org . config.org)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;custom-zone&#x2F;end-of-buffer.el . end-of-buffer.el)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;custom-zone&#x2F;waves.el . waves.el)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;promise&#x2F;.gitignore . promise&#x2F;.gitignore) ;; &amp;lt;-- The other gitignore
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;promise&#x2F;LICENSE . LICENSE)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;promise&#x2F;promise-test.el . promise-test.el)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (elisp&#x2F;promise&#x2F;promise.el . promise.el)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (init-standard.el . init-standard.el)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (init.el . init.el)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; (personal.el . personal.el)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aside from using the &lt;code&gt;alist&lt;&#x2F;code&gt; version which shows the original value
and the uniquified value, notice the &lt;code&gt;cdr&lt;&#x2F;code&gt; of the same filenames are
now unique. So if we are given a list of project files we can just use
that function and we are near the mark.&lt;&#x2F;p&gt;
&lt;p&gt;Now, let&#x27;s see what we can do about exposing the path now that we have this.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-path&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#project-path&quot; aria-label=&quot;Anchor link for: project-path&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Project Path&lt;&#x2F;h2&gt;
&lt;p&gt;So with the previous concept, I want to display the path after the
label almost like a two column table. Seems easy enough with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;f.el#f-dirname-path&quot;&gt;f-dirname&lt;&#x2F;a&gt;
but taking with the uniquified issue as above.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;out-pair &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;,value . ,unique&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s | %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; unique&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;dirname value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Remember the original
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Given (.gitignore . &#x2F;.gitignore)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;out&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;.gitignore&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;&#x2F;.gitignore&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;.gitignore | &#x2F;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Given (elisp&#x2F;promise&#x2F;.gitignore . promise&#x2F;.gitignore)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;out&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elisp&#x2F;promise&#x2F;.gitignore&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;promise&#x2F;.gitignore&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;promise&#x2F;.gitignore | elisp&#x2F;promise&#x2F;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Combining them as an hypothetical display
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;.gitignore | &#x2F;.gitignore&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;promise&#x2F;.gitignore | elisp&#x2F;promise&#x2F;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So nothing is really wrong with this but there is a redundancy in path
with &lt;code&gt;promise&#x2F;.gitignore&lt;&#x2F;code&gt;. It would be nice if the path could be
trimmed from the highest point like so.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;relative-parent-path &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path relative&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Check this out in the implementation
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;   Again it is only for this problem&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;out-pair2 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;,value . ,unique&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;message &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;%s | %s&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; unique&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;relative&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;parent&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path value unique&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Instead of
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;promise&#x2F;.gitignore | elisp&#x2F;promise&#x2F;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Would be nice if
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;promise&#x2F;.gitignore | elisp&#x2F;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;out&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair2 &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;elisp&#x2F;promise&#x2F;.gitignore&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; . &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;promise&#x2F;.gitignore&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Sadly, the code, &lt;code&gt;relative-parent-path&lt;&#x2F;code&gt;, for that isn&#x27;t worth
reviewing as it is only meant for this problem. Now it does look
better, which is good enough for me: unique path combined with
completing path.&lt;&#x2F;p&gt;
&lt;p&gt;But there is one more enhancement I would love to see: reversed paths&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reversing-paths&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reversing-paths&quot; aria-label=&quot;Anchor link for: reversing-paths&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Reversing Paths&lt;&#x2F;h2&gt;
&lt;p&gt;Instead of reading &lt;code&gt;&#x2F;a&#x2F;b&#x2F;c&#x2F;d&lt;&#x2F;code&gt;, I find it curiously interesting if it
could be written as &lt;code&gt;d..c..b..a&lt;&#x2F;code&gt; which is easy enough to do with
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;f.el#f-split-path&quot;&gt;f-split&lt;&#x2F;a&gt; and &lt;code&gt;reverse&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;defconst fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;separator &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn-notation &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;lexical&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pieces &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;split path&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;join &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;reverse fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pieces&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; How does it look here?
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;promise&#x2F;.gitignore | elisp&#x2F;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Ah much better
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;&amp;quot;.gitignore..promise | elisp&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The choice of separator is yours but the idea of reversing it allows
me to home in to the file I am looking for and its contextualized
parent. Minor enhancement are really important sometimes.&lt;&#x2F;p&gt;
&lt;p&gt;Again this notation is optional but I really like it and it makes me
wonder why there isn&#x27;t this option available. And with that, we can
now start hacking after trying out some stuff.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;really-hacking&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#really-hacking&quot; aria-label=&quot;Anchor link for: really-hacking&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Really Hacking&lt;&#x2F;h2&gt;
&lt;p&gt;There is really one question that should have been answered in the
first place: &lt;strong&gt;why the completion system?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Well, I thought about advicing &lt;code&gt;helm-projectile&lt;&#x2F;code&gt; and
&lt;code&gt;projectile-current-project-files&lt;&#x2F;code&gt; but I thought that it might do more
damage as the latter is the source, not the display, while the former
is a bit harder to track down cleanly. I settled on the
&lt;code&gt;projectile-completion-system&lt;&#x2F;code&gt; as it is a natural point to hook in. So
that&#x27;s why.&lt;&#x2F;p&gt;
&lt;p&gt;Actually, my problem is that there is no hook or mapping function that
one can use being &lt;code&gt;helm&lt;&#x2F;code&gt; and all. After the next section, there are
references in the &lt;code&gt;helm-projectile&lt;&#x2F;code&gt; code that assumes a direct source
to label mapping; meaning making this change might break other
functionality which isn&#x27;t needed. I really just want
&lt;code&gt;projectile-find-file&lt;&#x2F;code&gt; to have a cool display, not blow up
&lt;code&gt;describe-variable&lt;&#x2F;code&gt; or something.&lt;&#x2F;p&gt;
&lt;p&gt;Here is the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bbatsov&#x2F;helm-projectile&#x2F;issues&#x2F;38&quot;&gt;ticket&lt;&#x2F;a&gt; I filed for that. If that has a good answer, then
much of the code I written could be easily adapted to use that instead
of my customization.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;helm-completion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#helm-completion&quot; aria-label=&quot;Anchor link for: helm-completion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Helm Completion&lt;&#x2F;h2&gt;
&lt;p&gt;Okay, so now that we can turn the source into a desirable output. How
does the actual completion engine or &lt;code&gt;helm&lt;&#x2F;code&gt; work? Or more precisely
&lt;code&gt;helm-comp-read&lt;&#x2F;code&gt;, which is used by &lt;code&gt;projectile-completion-system&lt;&#x2F;code&gt;?
Let&#x27;s see the code where this happens.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;completion&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;system &amp;#39;helm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;fboundp &amp;#39;helm&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;helm&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read prompt choices
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     :initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;input initial&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;input
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     :candidates&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;in&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;buffer &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;t
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                     :must&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;match &amp;#39;confirm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;   &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;user&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;Please install helm from \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;emacs-helm&#x2F;helm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So &lt;code&gt;helm-comp-read&lt;&#x2F;code&gt; takes a prompt and a collection of choices? So the
question is &lt;strong&gt;can collection be an alist instead of key value pairs?&lt;&#x2F;strong&gt;
I was skeptic at first but it actually does work and yet it did. I am
thankful it is because if it isn&#x27;t we have to create a
value-label-value mapping which just extra glue. So how does this look
like? I can write some code but it is better if you try it out
yourself.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;setq my&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prompt &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;What door do you want to open: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;helm&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read my&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prompt &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;loser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;B&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;winner&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;C&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;loser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; vs
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;choice &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;helm&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read my&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;prompt &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;list &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;B&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;C&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;))))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pcase choice
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;loser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;B&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;winner&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;C&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt; &amp;#39;loser&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So with that feature, we hook up our &lt;code&gt;f-uniquify-alist&lt;&#x2F;code&gt; and viola.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#081724;color:#f8f8f2;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Remmber the f-uniquify-alist is (value, label)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; So we create a swapper to make it appropriate
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;swap-pair &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cons &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;cdr pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;car pair&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;)))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;helm&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;comp&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;read &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;So what file do you want? &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;mapcar &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;&amp;#39;swap-pair &lt;&#x2F;span&gt;&lt;span style=&quot;color:#68f6cb;&quot;&gt;;; Just swap the fields before display
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;uniquify&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;alist
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;                         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;projectile&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;project&lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#96a5d9;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bad6e2;&quot;&gt;files&lt;&#x2F;span&gt;&lt;span style=&quot;color:#effffe;&quot;&gt;))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And with that you have an uniquified projectile file list. Everything
else is just composing more functions after &lt;code&gt;swap-pair&lt;&#x2F;code&gt; specifically
the &lt;code&gt;car&lt;&#x2F;code&gt; or label of it. So if one intends to create an hook, you
now know where it is.&lt;&#x2F;p&gt;
&lt;p&gt;The key display function is &lt;code&gt;display-formatter&lt;&#x2F;code&gt; in the implementation,
it is pretty much just a &lt;code&gt;format&lt;&#x2F;code&gt;. So there really isn&#x27;t much to
discuss or do you want to discuss functional style which I&#x27;ve taken?
Either way, one could do it very easily after this.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wish-list&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#wish-list&quot; aria-label=&quot;Anchor link for: wish-list&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Wish List&lt;&#x2F;h2&gt;
&lt;p&gt;So our discussion led us to a simple implementation of a projection
completion. But there are some things I wanted after implementing this
and maybe somebody can do this.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Uniquified paths are bold&lt;&#x2F;strong&gt;
: They have some face configuration that makes files bold while the
paths smaller and differently colored if possible. I haven&#x27;t
checked out face options yet&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Value and path are in two lines&lt;&#x2F;strong&gt;
: It would be nice to see the path to be below the file as it can
be easier to read but this is harder to implement with just
spaces and how &lt;code&gt;helm&lt;&#x2F;code&gt; is built on. I tried adding newlines to
each choice but this makes the selection a little bit more tricky
and delicate. Rough one line display is good enough.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#081724;color:#f8f8f2;&quot;&gt;&lt;code&gt;&lt;span&gt;There is some inkling of this implementation with the variable
&lt;&#x2F;span&gt;&lt;span&gt;`max-text-length` which is a stab at guessing the completion
&lt;&#x2F;span&gt;&lt;span&gt;buffer length and determine how many spaces to put or whether to
&lt;&#x2F;span&gt;&lt;span&gt;align the value to the path. Some ideas remain in making it more
&lt;&#x2F;span&gt;&lt;span&gt;aesthetically pleasing.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Performance concern&lt;&#x2F;strong&gt;
: While making this code I spotted a performance issue with
&lt;code&gt;f-uniquify-alist&lt;&#x2F;code&gt; with large projects which causes the UI to
hang. I filed a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rejeep&#x2F;f.el&#x2F;issues&#x2F;62&quot;&gt;issue&lt;&#x2F;a&gt; regarding this but I feel crafting a
personalized uniquified function might be the real solution&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;There might be more wishes but the intention is complete. So I hope
you found that story entertaining and that you try it out yourself or
maybe you taught I was crazy doing this. Ah, I prefer to think of the
latter as Emacs has caused me severe impairment. Cheers&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2016-08-03-update&quot;&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#2016-08-03-update&quot; aria-label=&quot;Anchor link for: 2016-08-03-update&quot;&gt;&gt;&gt;&lt;&#x2F;a&gt;
2016-08-03 Update&lt;&#x2F;h2&gt;
&lt;p&gt;So after hacking with &lt;code&gt;font-lock&lt;&#x2F;code&gt;, I can finally settle on this.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;fnlog.dev&#x2F;dev&#x2F;an-unique-projectile-completion&#x2F;pleased-completion.png&quot; alt=&quot;&quot; &#x2F;&gt;  &lt;&#x2F;p&gt;
&lt;p&gt;So I made the value indeed bolder, changing the size is safer than
changing the color, while I made the relative path much thinner to
separate them. It is compact and different enough, with this I don&#x27;t
need the tabular arrangement of space filling so good.  It looks fine
if I do say so myself.&lt;&#x2F;p&gt;
&lt;p&gt;Now I wonder what somebody else has done?&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
